分组背包
1 /**\ 2 每组物品有若干个,同一组内的物品最多只能选一个 3 \**/ 4 #include <bits/stdc++.h> 5 using namespace std; 6 const int N = 1e3 + 9; 7 int n, m, v[N][N], w[N][N], s[N]; 8 int f[N]; 9 signed main() { 10 ios::sync_with_stdio(false); 11 cin >> n >> m; 12 for(int i = 1; i <= n; i++) { 13 cin >> s[i]; 14 for(int j = 0; j < s[i]; j++) { 15 cin >> v[i][j] >> w[i][j]; 16 } 17 } 18 for(int i = 1; i <= n; i++) { 19 for(int j = m; j > 0; j--) { 20 for(int k = 0; k < s[i]; k++) { 21 if(v[i][k] <= j) 22 f[j] = max(f[j], f[j - v[i][k]] + w[i][k]); 23 } 24 } 25 } 26 cout << f[m]; 27 return 0; 28 }