java 动态规划 背包问题[通俗易懂]

java 动态规划 背包问题[通俗易懂]背包问题具体例子:假设现有容量10kg的背包,另外有3个物品,分别为a1,a2,a3。物品a1重量为3kg,价值为4;物品a2重量为4kg,价值为5;物品a3重量为5kg,价值为6。将哪些物品放入背包可使得背包中的总价值最大?首先想到的,一般是穷举法,一个一个地试,对于数目小的例子适用,如果容量增大,物品增多,这种方法就无用武之地了。  其次,可以先把价值最大的物体放入,这已经是贪

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

背包问题具体例子:假设现有容量10kg的背包,另外有3个物品,分别为a1,a2,a3。物品a1重量为3kg,价值为4;物品a2重量为4kg,价值为5;物品a3重量为5kg,价值为6。将哪些物品放入背包可使得背包中的总价值最大?

首先想到的,一般是穷举法,一个一个地试,对于数目小的例子适用,如果容量增大,物品增多,这种方法就无用武之地了。

  其次,可以先把价值最大的物体放入,这已经是贪婪算法的雏形了。如果不添加某些特定条件,结果未必可行。

  最后,就是动态规划的思路了。先将原始问题一般化,欲求背包能够获得的总价值,即欲求前i个物体放入容量为m(kg)背包的最大价值c[i][m]——使用一个数组来存储最大价值,当m取10,i取3时,即原始问题了。而前i个物体放入容量为m(kg)的背包,又可以转化成前(i-1)个物体放入背包的问题。下面使用数学表达式描述它们两者之间的具体关系。

  表达式中各个符号的具体含义。

  w[i] :  第i个物体的重量;

  p[i] : 第i个物体的价值;

  c[i][m] : 前i个物体放入容量为m的背包的最大价值;

  c[i-1][m] : 前i-1个物体放入容量为m的背包的最大价值;

  c[i-1][m-w[i]] : 前i-1个物体放入容量为m-w[i]的背包的最大价值;

  由此可得:

      c[i][m]=max{c[i-1][m-w[i]]+pi , c[i-1][m]}(下图将给出更具体的解释)


                       java 动态规划 背包问题[通俗易懂]

根据上式,对物体个数及背包重量进行递推,列出一个表格(见下表),当逐步推出表中每个值的大小,那个最大价值就求出来了。推导过程中,注意一点,最好逐行而非逐列开始推导,先从编号为1的那一行,推出所有c[1][m]的值,再推编号为2的那行c[2][m]的大小。这样便于理解。

                   java 动态规划 背包问题[通俗易懂]

public class BackPack { public static void main(String[] args) { int m = 10; int n = 3; int w[] = {3, 4, 5}; int p[] = {4, 5, 6}; int c[][] = BackPack_Solution(m, n, w, p); for (int i = 1; i <=n; i++) { for (int j = 1; j <=m; j++) { System.out.print(c[i][j]+"\t"); if(j==m){ System.out.println(); } } } //printPack(c, w, m, n); } /** * @param m 表示背包的最大容量 * @param n 表示商品个数 * @param w 表示商品重量数组 * @param p 表示商品价值数组 */ public static int[][] BackPack_Solution(int m, int n, int[] w, int[] p) { //c[i][v]表示前i件物品恰放入一个重量为m的背包可以获得的最大价值 int c[][] = new int[n + 1][m + 1]; for (int i = 0; i < n + 1; i++) c[i][0] = 0; for (int j = 0; j < m + 1; j++) c[0][j] = 0; for (int i = 1; i < n + 1; i++) { for (int j = 1; j < m + 1; j++) { //当物品为i件重量为j时,如果第i件的重量(w[i-1])小于重量j时,c[i][j]为下列两种情况之一: //(1)物品i不放入背包中,所以c[i][j]为c[i-1][j]的值 //(2)物品i放入背包中,则背包剩余重量为j-w[i-1],所以c[i][j]为c[i-1][j-w[i-1]]的值加上当前物品i的价值 if (w[i - 1] <= j) { if (c[i - 1][j] < (c[i - 1][j - w[i - 1]] + p[i - 1])) c[i][j] = c[i - 1][j - w[i - 1]] + p[i - 1]; else c[i][j] = c[i - 1][j]; } else c[i][j] = c[i - 1][j]; } } return c; }
0 0 4 4 4 4 4 4 4 4 0 0 4 5 5 5 9 9 9 9 0 0 4 5 6 6 9 10 11 11 


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164400.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 随机森林算法(有监督学习)

    随机森林算法(有监督学习)一、随机森林算法的基本思想  随机森林的出现主要是为了解单一决策树可能出现的很大误差和overfitting的问题。这个算法的核心思想就是将多个不同的决策树进行组合,利用这种组合降低单一决策树有可能带来的片面性和判断不准确性。用我们常说的话来形容这个思想就是“三个臭皮匠赛过诸葛亮”。  具体来讲,随机森林是用随…

    2022年5月23日
    38
  • pycharmmatplotlib装不上_pycharm没有matplotlib模块

    pycharmmatplotlib装不上_pycharm没有matplotlib模块PythonDebug经验art.js/

    2022年8月29日
    4
  • ctk框架搭建(一) ctk框架插件加载与项目结构

    ctk框架搭建(一) ctk框架插件加载与项目结构序 使用CTK框架开发有大半年了,就实际应用上来说框架还比较可靠,但网上资料很少。而刚接触时项目已经有了相当大的体量,与业务等其他逻辑混淆,现在单独把ctk框架部分抽离出来做个总结分享,避免后来的人走弯路。 该系列介绍简单的ctk框架构建的方法,具体架构可根据自身项目设计,开发环境为macOSHighSierra,QtCreator5.10.0。ctk框架插件    CTK源码可以从Gi…

    2022年6月5日
    95
  • Ogre1.7.2 + CEGUI0.7.5配置[通俗易懂]

    Ogre1.7.2 + CEGUI0.7.5配置[通俗易懂]转载请说明出处!http://blog.csdn.net/zhanghua1816/article/details/6650509鉴于现在很多朋友开始学习研究Ogre或者CEGUI,不过很多朋友对如何配置这两个环境有很多问题,所以我把配置方法在此简单介绍一下,希望对大家有用,分享是一种快乐,大家共同进步嘛~~~。我这里的这种方法可能不是最简单的配置方法,但是我相信这种配置方法或许对

    2022年7月24日
    10
  • json_decod导致精度丢失问题「建议收藏」

    json_decod导致精度丢失问题「建议收藏」json_decod导致精度丢失问题

    2022年4月24日
    44
  • GoogleMaps_键盘网站

    GoogleMaps_键盘网站在Google地球中使用键盘/鼠标导航首先要明白导航过程中的三个中心,视野中心,相机视角,鼠标锁定位置。还要明白3D视图和俯视图、地平面视图的区别,因为在海拔为0时将进入地平面视图,上下的操作将变为拉近和推远。中间的位置为视野中心,可以通过Ctrl+Shif+左箭头/右箭头来触发显示,如果要展示的对象不在视野中心,可以通过Alt+左箭头/右箭头进行对象位置微调。-/+的中心为视野中心。相机视角可以通过Ctrl触发,为可以通过左箭头/右箭头控制水平方向旋转,上箭头/下箭头控制上下方向旋

    2022年9月2日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号