01背包
普通版本
/**\ f[i][j] 表示 前i件物品容量为j时最大价值 \**/ #includeusing namespace std; const int N = 1010; int n, m, v[N], w[N], f[N][N]; signed main() { 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) { if(j < v[i]) f[i][j] = f[i - 1][j]; else { f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]); } } } cout << f[n][m]; return 0; }
优化版本
1 /**\ 2 滚动数组优化 3 \**/ 4 #include5 using namespace std; 6 const int N = 1010; 7 int n, m, v[N], w[N], f[N]; 8 signed main() 9 { 10 cin >> n >> m; 11 for(int i = 1; i <= n; ++i) cin >> v[i] >> w[i]; 12 for(int i = 1; i <= n; ++i) 13 { 14 for(int j = m; j >= v[i]; --j) 15 { 16 f[j] = max(f[j], f[j - v[i]] + w[i]); 17 } 18 } 19 cout << f[m]; 20 return 0; 21 }
1 /**\ 2 如果题目要求刚好装满 3 \**/ 4 #include5 using namespace std; 6 const int inf = 0x3f3f3f3f; 7 const int mx = 1e4 + 9; 8 int n, m; 9 int f[mx], w[mx], v[mx]; 10 void solve() { 11 cin >> m >> n; 12 for(int i = 0; i < mx; i++) f[i] = -inf; 13 f[0] = 0; 14 for(int i = 1; i <= n; i++) { 15 cin >> v[i] >> w[i]; 16 } 17 for (int i = 1; i <= n; i++) { 18 for (int j = m; j >= v[i]; j--) { 19 f[j] = max(f[j], f[j - v[i]] + w[i]); 20 if (f[j] < 0) 21 f[j] = -inf; 22 } 23 } 24 if(f[m] > 0) cout << f[m]; 25 else cout << "no"; 26 } 27 int main() { 28 solve(); 29 return 0; 30 }