問題描述:有N件物品和一個容量爲V的揹包。第 i 件物品的代價是 c[i],價值是 v[i]。這些物品被劃分爲若干組,每組中的物品相互衝突。最多選一件。求解將哪些物品放入揹包可以在總代價不超過V的條件下(物品必須保持完整)使其其總價值最大。現有數據如下:
c = [[1,2,3],[2,3,4],[5,6,7,8],[7,9]];
v = [[2,3,4],[1,2,3],[4,5,6,7],[8,9]];
V = 11;
解題思路:令 表示前 i 組物品在代價爲 j 的揹包中的最大價值。那麼有 。根據0-1揹包問題的求解過程,上述表達式可以轉換爲 。注意該題嵌套for循環具體循環的內容。
public int knapsackProblem(int[][] c, int[][] v, int cap) {
int[] dp = new int[cap + 1];
for (int i = 0; i < c.length; i++) {
for (int j = cap; j > 0; j--) { // 確保每個組中至多隻有一個物品被選擇
for (int k = 0; k < c[i].length; k++) {
if (j >= c[i][k]) dp[j] = Math.max(dp[j], dp[j - c[i][k]] + v[i][k]);
}
}
}
return dp[cap];
}
上一篇:揹包問題之二維費用揹包問題
下一篇:揹包問題之輸出最優方案