动态规划-背包问题(0-1背包和完全背包)(Java)

0-1背包

0-1背包特点就是有几种物品,每种物品有一个,分别给你重量和价值,然后怎么装才能获取最大利益
个人感觉0-1背包的精髓就在画表
在这里插入图片描述
即得出代码

for (int i = 1; i <= 物品数; i++) {
    
    
     for (int j = 1; j <= 背包总重量; j++) {
    
    
          dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-当前物品重量]+当前物品价值);
   	 }
}

然后就是优化问题
优化1:因为每次用的都是上一行的数据,所以只要反向遍历,那么在你更新后面的数据的时候用的前面的数据就是上一行的,所以只需要一个一维数组即可。
优化2:通过观察可以发现每行小于当前物品容量之前的容量的那几个数都是跟着上面直接顺下来的,所以遍历时候不管也行。
得出代码:

for (int i = 1; i <= 物品数; i++) {
    
    
   for (int j = 背包总重量; j >=当前物体重量 ; j--) {
    
    
   		dp[j]=Math.max(dp[j-重量]+价值,dp[j]);
   }
}

附我学0-1背包的视频,一下我就学会了:0-1背包

完全背包

完全背包跟0-1背包的区别就是完全背包每一个东西都是能随便拿的。
所以画图时候会有区别
在这里插入图片描述

这个也是B站一个大佬的视频,方程唯一的区别就是0-1回去上一行找,而完全背包是在当前行找,我学的时候想了一个问题不知道大家想没想,就是只看dp[i][j-w]和dp[i-1][j]的大小会不会遗漏dp[i-1][j-w]这个的大小,后来发现其实dp[i][j-w]一定会大于等于dp[i-1][j-w],所以没必要考虑。所以本质上就是比0-1多考虑一个dp[i][j-w],然后把上一行的忽略。
直接粘优化代码了,0-1反向,完全正向遍历,因为遍历当前点的时候会需要前面点更新完的值。
然后也贴出我学的视频:完全背包
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43590593/article/details/113573120