题目
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int n, vm;
int s[N];
int v[N][N], w[N][N];
int f[N][N][N];
int main()
{
cin >> n >> vm;
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 = 1; j <= s[i]; j++)
{
for(int k = 1; k <= vm; k++)
{
f[i][j][k] = f[i-1][s[i-1]][k]; //整组不选
if(k >= v[i][j]) f[i][j][k] = max(f[i][j][k], f[i-1][s[i-1]][k - v[i][j]] + w[i][j]); //选
for(int t = 1; t < j; t++)
{
f[i][j][k] = max(f[i][j][k], f[i][t][k]); //选本组其它
}
}
}
}
cout << f[n][s[n]][vm];
}
思路
状态: f[i][j][k] 表示 1~i-1组各个物品都考虑,i组1~j号物品都考虑,所用空间不超过k的所有方案集合
属性:价值最大值
状态计算:
1. 选i组j号物品
组号退回i-1,编号退回i-1组编号最大值,空间减去所用空间
2. 不选该物品,由于本组都不选
3. 不选该物品,由于本组之前选了
,