💬推荐一款模拟面试、刷题神器,从基础到大厂面试题👉点击跳转刷题网站进行注册学习
前言
01背包正常解法dp数组为二维数组,优化可以使用一维数组倒推进行实现。
一般动态规划求解01背包:
https://blog.csdn.net/m0_55486529/article/details/123806820
一、为什么可以用一维数组实现呢?
二维:
求解第i行时,只需要第i-1行的结果,前面的结果已经没用了。求解c[ i ] [ j ]时,只需要上一行j列或上一行j-w[ i ]列的结果。是否可以进行空间优化?
例如,处理第4种物品(w[4]=2,v[4]=4)时,只需第3种物品的处理结果(上一行)。求第j列时,若j<w[4],则照抄上一行;若j≥w[4],则需要将上一行第j列的值与上一行第 j-w[4]列的值+v[4]取最大值。
只需上一行当前列和前面列的值,因此只用一个一维数组倒推即可状态表示: dp[i]表示将物品放入容量为j的背包中可以获得的最大价值。状态转移方程:
dp[j]=max {dp[ j ].dp[ j-w[i]]+v[i]}。
二、为什么要倒推?
数组里面的值是根据前面的值推出的,可以参考状态转移方程,如果我们从前面开始推那么,后面推出的值不准确。
三、代码实现
代码如下:
public class test {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int[] w= {2,5,4,2,3};
int[] v= {6,3,5,4,6};
System.out.println(bagkiller(w,v,10));
}
public static int bagkiller(int[] w,int[] v,int n) {
int [] dp=new int[n+1];
for (int i=0;i<w.length;i++) {
for (int j=n;j>=1;j--) {
if (j>=w[i] ) {
dp[j]=Math.max(dp[j], dp[j-w[i]]+v[i]);
}
}
}
return dp[n];
}
}
结果:
17
总结
以上就是今天要讲的内容,本文仅仅简单介绍了01背包的优化。