完全背包问题就是每个东西都不限数量的,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)); } public static int knapsack(int[] v, int[] w, int W) { int[] tmp = new int[W + 1]; for (int i = 0; i < v.length; i++) completePack(tmp, v[i], w[i], W); return tmp[W]; } /** * * @param tmp * 辅助数组 * @param value * 当前v[i]的价值 * @param weight * 当前w[i]的重量 * @param W * 总重量 */ public static void completePack(int[] tmp, int value, int weight, int W) { for (int i = 0; i <= W; i++) { tmp[i] = i - weight >= 0 ? Math .max(tmp[i], tmp[i - weight] + value) : tmp[i]; } } }
原文:http://blog.csdn.net/chenxuegui1234/article/details/20791743