分组背包问题
问题
有 N N N组物品和一个容量是 V V V的背包。
每组物品有若干个,同一组内的物品最多只能选一个。
每件物品的体积是
v
i
j
v_{ij}
vij,价值是
w
i
j
w_{ij}
wij,其中
i
i
i是组号,
j
j
j是组内编号。
求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。
题解
#include<iostream>
#include<cmath>
using namespace std;
int n, m, s[105], v[105][105], w[105][105], f[105];
int main()
{
cin >> n >> m;
for(int i = 1 ;i <= n ;i ++)
{
cin >> s[i];
for(int j = 1 ;j <= s[i] ;j ++)
cin >> v[i][j] >> w[i][j];
}
for(int i = 1 ;i <= n ;i ++)
for(int j = m ;j >= 0 ;j --)
for(int k = 1 ;k <= s[i] ;k ++)
if(j >= v[i][k]) f[j] = max(f[j] , f[j - v[i][k]] + w[i][k]);
cout << f[m] << endl;
return 0;
}
其中for
循环部分不能改为以下部分