voidknapsack(int n, int w)// n 为物品数,w 为背包负重上限 { memset(c, 0, sizeof(c));
for (int i = 0; i < n; ++i) // 每个物品都试试看 for (int j = 0; j <= w; ++j) // 每个重量都试试看 if (j - items[i].weight < 0) c[i+1][j] = c[i][j]; // 放不下 else c[i+1][j] = max( c[i][j], c[i][j - items[i].weight] + items[i].value );
cout << "Max Value: " << c[n][w] << endl; }
Top Down 递归
1 2 3 4 5 6 7 8 9 10 11 12
intknapsack(int W) { int i, space, max, maxi, t; if (maxKnow[W] != -1) return maxKnown[W];
for (i = 0, max = 0; i < N; i++) if ((sapce = W - items[i].weight) >= 0) if ((t = knapsack(space) + items[i].value) > max) { max = t; maxi = i; } maxKnown[W] = max; itemKnown[W] = items[maxi]; return max }
defknapsack_iter(W, items): A = zeros(2 * W).reshape(2, W) i = 0
for (v, w) in items: A[(i+1)%2][:w] = A[i%2][:w] A[(i+1)%2][w:] = maximum(A[i%2][w:], A[i%2][:W-w] + v) i += 1 return A[i%2][W-1]
defknapsack_recur(W, items): # top-down solution with memoization via hashtable N = len(items) A = {} defA_(i, j): if (str(i)+','+str(j)) in A: return A[str(i)+','+str(j)] # memoization if i == 0: return0 v, w = items[i] if j-w < 0: result = A_(i-1, j) A[str(i)+','+str(j)] = result # memoization return result else: result = max(A_(i-1, j), A_(i-1, j-w) + v) A[str(i)+','+str(j)] = result # memoization return result return A_(N-1, W-1)