分组背包问题

有 N 组物品和一个容量是 V 的背包。

每组物品有若干个,同一组内的物品最多只能选一个。
每件物品的体积是 vij,价值是 wij,其中 i 是组号,j 是组内编号。

求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。

输出最大价值。

输入格式
第一行有两个整数 N,V,用空格隔开,分别表示物品组数和背包容量。

接下来有 N 组数据:

每组数据第一行有一个整数 Si,表示第 i 个物品组的物品数量;
每组数据接下来有 Si 行,每行有两个整数 vij,wij,用空格隔开,分别表示第 i 个物品组的第 j 个物品的体积和价值;
输出格式
输出一个整数,表示最大价值。

数据范围
0 0 0 输入样例
3 5
2
1 2
2 4
1
3 4
1
4 5
输出样例:
8

#include 

using namespace std;
int n,V,v[105],w[105],s,dp[105];

int main()
{
    cin >> n >> V;
    while(n--)
    {
        cin >> s;
        for(int i=0;i<s;i++)
        {
            cin >> v[i] >> w[i];
        }
        for(int i=V;i>=0;i--)
        {
            for(int j=0;j<s;j++)
            {
                if(i>=v[j])
                    dp[i]=max(dp[i],dp[i-v[j]]+w[j]);
            }
        }
    }
    cout << dp[V] << endl;
    return 0;
}

你可能感兴趣的:(dp)