動態規劃之揹包九講之六 — 分組揹包

題目:有 N 組物品和一個容量是 V 的揹包。每組物品有若干個,同一組內的物品最多隻能選一個。每件物品的體積是 vij,價值是 wij,其中 i 是組號,j 是組內編號。求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,且總價值最大。輸出最大價值。

輸入格式
第一行有兩個整數 N,V,用空格隔開,分別表示物品組數和揹包容量。接下來有 N 組數據:每組數據第一行有一個整數 Si,表示第 i 個物品組的物品數量;每組數據接下來有 Si 行,每行有兩個整數 vij,wij,用空格隔開,分別表示第 i 個物品組的第 j 個物品的體積和價值;

輸出格式
輸出一個整數,表示最大價值。

數據範圍
0<N,V≤100
0<Si≤100
0<vij,wij≤100

解析:本題與多重揹包有聯繫,多重揹包是分組揹包的一個特例,以多重揹包每一種物品爲一組,該組中的物品的個數從0…n打包,每一包作爲一個新去拼。即成爲分組揹包。

Code:

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 110;
int f[N],v[N],w[N];
int main()
{
    int n,V;
    cin>>n>>V;
    for(int i=0;i<n;i++)
    {
        int s;
        cin>>s;
        for(int j=0;j<s;j++)
        {
            cin>>v[j]>>w[j];
        }
        for(int j=V;j>=0;j--)
        {
            for(int k=0;k<s;k++)
            {
                if(j >= v[k])   f[j] = max(f[j],f[j-v[k]]+w[k]);
            }
            
        }
    }
    cout<<f[V];
    return 0;
}

ps:博主能力有限,如果讀者發現什麼問題,歡迎私信或評論指出不足。歡迎讀者詢問問題,樂意盡我所能解答讀者的問題。歡迎評論,歡迎交流。謝謝大家!

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