为什么背包实现需要n作为参数

时间:2013-08-20 01:58:45

标签: java algorithm

当我读到背包问题(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;
}

所以我的问题是:

  1. 为什么我们需要n来论证?
  2. 陈述if(s [n]&gt; W)result = Value(n-1,W);让我更难理解为什么
  3. 对于我的方法的记忆版本,我看到了同样的大O.还有其他区别吗?
  4. 感谢。

1 个答案:

答案 0 :(得分:0)

你实际上是在解决另一个问题。第一段代码(n)解决了 0-1背包问题,您可以选择最多使用任何特定项目(即没有“复制”项目)。在这种情况下,您需要n来跟踪您已用完的项目。

在第二段代码中,您正在解决无界背包问题,您可以在其中无限次地使用每个项目。

它们都是NP-complete背包问题的形式,但它们有不同的解决方案。