有 M 件物品,體積 W[i],價值 P[i]。背包容量 V。每件至多取一次,求最大總價值。並輸出選取的物品編號。
dp[j]:容量為 j 時的最大價值。i = 1..M,容量 j = V..W[i] **逆序** 更新:dp[j] = max(dp[j], dp[j - W[i]] + P[i])。int dp[V+1] = {0};
for (int i = 0; i < M; ++i) {
for (int j = V; j >= W[i]; --j) {
if (dp[j] < dp[j - W[i]] + P[i])
dp[j] = dp[j - W[i]] + P[i];
}
}
cout << dp[V] << endl;
W[i], P[i] 數組。used = V;而 dp[used] == dp[used-1] 則 used--(背包未必裝滿)。i = M-1..0:若 used >= W[i] && dp[used] == dp[used - W[i]] + P[i],則選取了物品 i,used -= W[i]。int used = V;
while (used > 0 && dp[used] == dp[used-1]) --used;
for (int i = M-1; i >= 0; --i) {
if (used >= W[i] && dp[used] == dp[used - W[i]] + P[i]) {
cout << i+1 << " "; // 物品編號
used -= W[i];
}
}