揹包問題之分組揹包問題

問題描述:有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;

解題思路:令 dp[i][j]dp[i][j] 表示前 i 組物品在代價爲 j 的揹包中的最大價值。那麼有 dp[i][j]=max{dp[i1][j],dp[i1][jc[k]]+v[k]}kgroup[i]dp[i][j]=max\{dp[i-1][j],dp[i-1][j-c[k]]+v[k]\}| k \subset group[i]。根據0-1揹包問題的求解過程,上述表達式可以轉換爲 dp[j]=max{dp[j],dp[jc[k]]+v[k]}dp[j]=max\{dp[j],dp[j-c[k]]+v[k]\}。注意該題嵌套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];
    }

上一篇:揹包問題之二維費用揹包問題
下一篇:揹包問題之輸出最優方案

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章