居然没想到背包问题还可以这么实现,在空间复杂度上达到O(W)次,有点不可思议啊
比较简单,不解释了,debug一下就明白了
/**
* 背包问题<br/>
* f[w]=max{ f[v],f[w-w[i]]+v[i]}<br/>
* 也就是f[w][i] = max{f[w][i],f[w-w[i]+v[i]}<br/>
* 时间复杂度O(VW) 空间复杂度O(W)<br/>
* 也就是改进了空间复杂度了
*
* @author Joeson
*/
public class ZeroPackage {
public static void main(String[] args) {
int[] value = new int[]{12, 10, 20, 15, 20};
int[] weight = new int[]{2, 1, 3, 2, 2};
int W = 5;
System.out.println(zeroPackageDiv(value, weight, 0, W));
System.out.println(zeroPackage(value, weight, W));
}
/**
* 非递归实现
*/
public static int zeroPackage(int[] values, int[] weights, int totalWeight) {
int[] dp = new int[totalWeight + 1];
for(int i = 0; i < values.length; i++) {
for (int t = totalWeight; t >= weights[i]; t--) {
dp[t] = Math.max(dp[t - weights[i]] + values[i], dp[t]);
}
}
return dp[totalWeight];
}
/**
* 递归实现
*/
public static int zeroPackageDiv(int[] values, int[] weights, int index, int leftWeight) {
if (leftWeight <= 0 || index >= values.length) {
return 0;
}
int val1 = zeroPackageDiv(values, weights, index + 1, leftWeight);
if (leftWeight < weights[index]) {
return val1;
}
int val2 = zeroPackageDiv(values, weights, index + 1, leftWeight - weights[index]) + values[index];
return Math.max(val1,val2);
}
}