题目描述
分析:
由于每组只能选一样物品,加一层循环从每个组里判断选每个物品的情况,如果每个组有多个物品,又要加一层循环
同理,可以优化成一维数组
样例
3 5
2
1 2
2 4
1
3 4
1
4 5
算法1
$O(1e6)$
C++ 代码
#include<iostream>
using namespace std;
const int N = 110;
int v[N][N], w[N][N],f[N][N], M, V;
int nv[N], sw[N];
void dp()
{
for(int i = 1; i <= M; ++i)
{
for(int j = 1; j <= V; ++j)
{
f[i][j] = f[i - 1][j];
/*每组只能选一样物品,加一层循环从每个组里判断选每个物品的情况,如果每个组有多个物品,又要加一层循环*/
for(int k = 1; k <= nv[i]; ++k)
if(v[i][k] <= j)
f[i][j] = max(f[i][j], f[i - 1][j - v[i][k]] + w[i][k]);
}
}
}
int main()
{
cin >> M >> V;
for(int i = 1; i <= M; ++i)
{
int n; cin >> n;
for(int j = 1; j <= n; ++j)
{
cin >> v[i][j] >> w[i][j];
nv[i] = n;
//sw[i] += w[i][j];
}
}
dp();
cout << f[M][V] <<endl;
return 0;
}