分组背包

类似多重背包,只是将每件物品选几个变成每组物品选哪一个

状态转移方程 f [ i ] [ j ] = M a x ( f [ i − 1 ] [ j ] , f [ i − 1 ] [ j − v [ i ] [ k ] ] + w [ i ] [ k ] ) f[i][j] = Max(f[i-1][j],f[i-1][j-v[i][k]] + w[i][k]) f[i][j]=Max(f[i1][j],f[i1][jv[i][k]]+w[i][k])

所以优化成一维时需要从大到小枚举 j j j

int n, m;
int f[N];
int v[N][N], w[N][N], s[N];
int main() {
   
	cin >> n >> m;
	for (int i = 1;i <= n;++i) {
   
		cin >> s[i];
		for (int j = 0;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 = 0;k < s[i];++k) {
   
				if (v[i][k] <= j)f[j] = max(f[j], f[j - v[i][k]] + w[i][k]);
			}
		}
	}