背包九讲(一)
前言:最近在看背包九讲,将自己的理解给记录下来
基本思路那里,可以理解为将这个背包问题简化成是否要放下第i件物品,放下第i件物品就要重背包中取出重量等同的物品
关于优化空间
优化前dp[][]数组的值
代码
import java.util.Arrays;
public class PackageProblem {
public static void main(String[] args) {
int value[] = {0,3,7,8,1};
int weight = 10;
int[][] dp = new int[value.length][weight+1];
int i, j;
for(i=1; i<value.length; i++)
{
for(j=value[i]; j<=weight; j++)
{
dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-value[i]]+value[i]);
}
}
for(i=1; i<value.length; i++)
System.out.println(Arrays.toString(dp[i]));
}
}
优化后dp[]数组的值
代码
import java.util.Arrays;
public class PackaheProblem02 {
public static void main(String[] args) {
int value[] = {0,3,7,8,1};
int weight = 10;
int[] dp = new int[weight+1];
int i, j;
for(i=1; i<value.length; i++)
{
for(j=weight; j>=value[i]; j--)
dp[j] = Math.max(dp[j], dp[j-value[i]]+value[i]);
System.out.println(Arrays.toString(dp));
}
}
}
可以很清楚的看到,优化的思路就是不断的更新这个一维数组,但是为什么要逆序的?
如果你从前面开始更新这个一维数组,那么后面得到元素就不是前一轮的了,而是你更新过的,也就是书上写的变成了[i,v]=F[i,v-ci]
了
参考
《背包九讲》第一章