完全背包问题就是每个东西都不限数量的,01背包问题呢,则是限制数量为1
对于改进了的01背包问题,也有改进了的背包问题,他们的想法上是一致的,只不过实现上有了一点差别
也是比较简单的,亲手debug一下吧
/**
* 完全背包问题<br/>
*
* f[v]=max{f[w],f[w-w[i]]+v[i]}<br/>
* 也就是f[i][v] = max{f[w],f[w-w[i]]+v[i]}<br/>
* 时间复杂度O(WN)<br/>
* 空间复杂度O(W)<br/>
*
* @author Joeson
*
*/
public class CompletePack {
public static void main(String[] args) {
int[] value = new int[]{12, 10, 20, 35, 20};
int[] weight = new int[]{2, 1, 3, 2, 2};
int W = 5;
System.out.println(knapsack(value, weight, W));
}
private static int knapsack(int[] v, int[] w, int W) {
int[] tmp = new int[W + 1];
for (int i = 0; i < v.length; i++) {
for (int j = 0; j <= W; j++) {
tmp[j] = j - w[i] >= 0 ? Math
.max(tmp[j], tmp[j - w[i]] + v[i]) : tmp[j];
}
}
return tmp[W];
}
}