当我读到背包问题(http://en.wikipedia.org/wiki/Knapsack_problem)的解决方案时,我无法理解为什么参数中存在迭代次数n。看来我们可以通过检查传递的限制来查看叶子用例。防爆。 15KG背包问题,解决方案似乎如下:
Value(n, W){ // W = limit, n = # items still to choose from
if (n == 0) return 0;
if (arr[n][W] != unknown) return arr[n][W]; // <- add memoize
if (s[n] > W) result = Value(n-1,W);
else result = max{v[n] + Value(n-1, W-w[n]), Value(n-1, W)};
arr[n][W] = result; // <- add memoize
return result;
}
我的非memoize方法如下所示,至少对我来说更容易理解,也可以通过memoization进行改进。
static int n =5;
static int [] w = new int[]{12,2,1,4,1}; //weight
static int [] v = new int[]{4,2,1,10,2}; //value
public static int knapSack(int wt){
int maxValue = 0,vtemp = 0, wtemp =0;
if (wt ==0) return 0;
for (int i=0; i<n; i++){
if (w[i] > wt) continue;
int tmp = v[i] + knapSack(wt - w[i]);
if (tmp > maxValue){
maxValue = tmp;
vtemp = v[i];
wtemp = w[i];
}
}
System.out.println("wt="+wt + ",vtemp="+vtemp+",wtemp="+wtemp+",ret max="+maxValue);
return maxValue;
}
所以我的问题是:
感谢。
答案 0 :(得分:0)
你实际上是在解决另一个问题。第一段代码(n
)解决了 0-1背包问题,您可以选择最多使用任何特定项目(即没有“复制”项目)。在这种情况下,您需要n
来跟踪您已用完的项目。
在第二段代码中,您正在解决无界背包问题,您可以在其中无限次地使用每个项目。
它们都是NP-complete背包问题的形式,但它们有不同的解决方案。