ナップザック問題の解決策 ( 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;
}
私の非メモ化方法は次のようになります。これは、少なくとも私にとっては理解しやすく、メモ化によって改善される可能性もあります。
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;
}
だから私の質問は:
- 引数に n が必要なのはなぜですか?
- ステートメント if (s[n] > W) result = Value(n-1,W); 理由を理解するのをさらに難しくする
- 私のアプローチのメモ化されたバージョンでも、同じ大きな O が表示されます。他に違いはありますか?
ありがとう。