#include<iostream> #define int long long usingnamespace std;
// 完全背包问题,每件物品可以无限次使用 // 对于f[i][j],可以分为若干个集合 // 第 i 个物品选 0, 1, 2, 3, ..., k 个 // 1. 去掉 k 个物品 i // 2. f[i - 1][j - k * v[i]] + k * w[i]
constint N = 1111; int v[N], w[N]; int f[N][N];
voidsolve(){ // n 个物品,总体积 m int n, m; cin >> n >> m; for (int i = 1; i <= n; i++) cin >> v[i] >> w[i]; for (int i = 1; i <= n; i++) { for (int j = 0; j <= m; j++) { for (int k = 0; k * v[i] <= j; k++) { f[i][j] = max(f[i][j], f[i - 1][j - k * v[i]] + k * w[i]); } } } cout << f[n][m] << endl; }
signedmain(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); int T = 1; // cin >> T; while (T--) solve(); return0; }
voidsolve(){ // n 个物品,总体积 m int n, m; cin >> n >> m; for (int i = 1; i <= n; i++) cin >> v[i] >> w[i]; for (int i = 1; i <= n; i++) { for (int j = 0; j <= m; j++) { f[i][j] = f[i - 1][j]; if (j >= v[i]) f[i][j] = max(f[i][j], f[i][j - v[i]] + w[i]); } } cout << f[n][m] << endl; }
signedmain(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); int T = 1; // cin >> T; while (T--) solve(); return0; }
#include<iostream> #define int long long usingnamespace std;
constint N = 1111; int v[N], w[N]; int f[N];
voidsolve(){ // n 个物品,总体积 m int n, m; cin >> n >> m; for (int i = 1; i <= n; i++) cin >> v[i] >> w[i]; for (int i = 1; i <= n; i++) { // 顺序遍历,因为每次是更新都是 i, 而不是 i - 1 // 所以用更新完之后的数据 for (int j = 0; j <= m; j++) { if (j >= v[i]) f[j] = max(f[j], f[j - v[i]] + w[i]); } } cout << f[m] << endl; }
signedmain(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); int T = 1; // cin >> T; while (T--) solve(); return0; }
constint N = 1111; int v[N], w[N], s[N]; int f[N][N];
voidsolve(){ int n, m; cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> v[i] >> w[i] >> s[i]; } for (int i = 1; i <= n; i++) { for (int j = 0; j <= m; j++) { for (int k = 0; k <= s[i] && j >= k * v[i]; k++) { f[i][j] = max(f[i][j], f[i - 1][j - k * v[i]] + k * w[i]); } } } cout << f[n][m] << endl; }
signedmain(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); int T = 1; // cin >> T; while (T--) solve(); return0; }
#include<bits/stdc++.h> #define int long long usingnamespace std;
constint N = 25000, M = 2010;
int n, m; int v[N], w[N]; int f[N];
voidsolve(){ cin >> n >> m; int cnt = 0; // 二进制优化 // 把原来的物品分为若干个1, 2, 4, ... 的子物品 // 每个子物品都可以组合为原物品的所有状态 for (int i = 1; i <= n; i++) { int a, b, s; cin >> a >> b >> s; int k = 1; while (k <= s) { cnt++; v[cnt] = a * k; w[cnt] = b * k; s -= k; k *= 2; } if (s > 0) { cnt++; v[cnt] = a * s; w[cnt] = b * s; } } // 转化为 01 背包问题 n = cnt; for (int i = 1; i <= n; i++) { for (int j = m; j >= v[i]; j--) { f[j] = max(f[j], f[j - v[i]] + w[i]); } } cout << f[m] << endl; }
signedmain(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); int T = 1; // cin >> T; while (T--) solve(); return0; }