揹包九講3——多重揹包問題的理解(Java圖解)

多重揹包

題目

有N種物品和一個容量爲V的揹包。第i種物品最多有n[i]件可用,每件費用是c[i],價值是w[i]。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

基本算法

這題目和完全揹包問題很類似。基本的方程只需將完全揹包問題的方程略微一改即可,因爲對於第i種物品有n[i]+1種策略:取0件,取1件……取n[i]件。令f[i][v]表示前i種物品恰放入一個容量爲v的揹包的最大權值,則有狀態轉移方程:

f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}

 

多重揹包模板代碼:

//N爲物品數目
//W爲揹包容量
//num[]爲每個物品的數目
//weights[]爲每個物品的體積
//values[]爲每個物品的價值
public int multiKnapack(int N, int W, int[] num, int[] weights, int[] values){
    int[] dp = new int[W+1];
    for(int i = 1; i <= N; i++){
        int M = num[i-1], w = weights[i-1], v = values[i-1];
        for(int j = W; j >= w; j--){
            for(int k = 0; k <= M && k * w < =j; k++){
                dp[j] = Math.max(dp[j], dp[j-k*v]+k*w);
            }
        }
    }
    return dp[W];
}

(內容待補充,使用單調隊列優化基本算法的狀態轉移方程)

 

推薦:

揹包九講1——01揹包問題的理解(Java圖解)

https://blog.csdn.net/caigen0001/article/details/106698380

揹包九講2——完全揹包問題的理解(Java圖解)

https://blog.csdn.net/caigen0001/article/details/106711469

揹包九講3——多重揹包問題的理解(Java圖解)

https://blog.csdn.net/caigen0001/article/details/106720118

揹包九講4——二維揹包問題的理解(Java圖解)

https://blog.csdn.net/caigen0001/article/details/106720280

 

 

參考資料:

揹包九講 https://github.com/tianyicui/pack

揹包九講專題 https://www.bilibili.com/video/BV1qt411Z7nE?from=search&seid=6165804124910947817

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