AcWing 3.完全揹包問題
阿新 • • 發佈:2021-08-13
題目連結 AcWing 3. 完全揹包問題
樸素法
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 1010; int n, m; int v, w; int f[N][N]; //f[i][j]表示只考慮前i件物品 揹包容量為j 時, 所能裝下的最大價值 int main() { cin >> n >> m; for(int i = 1; i <= n; i ++) //列舉i件物品 { cin >> v >> w; for(int j = 1; j <= m; j ++) //列舉揹包容量從1開始到m { for(int k = 0; k * v <= j; k ++) //列舉當前揹包容量為j時第i件物品可以選幾件 從0開始一直到選不下為止(k * v > j) f[i][j] = max(f[i][j], f[i - 1][j - k * v] + k * w); } } cout << f[n][m] << endl; return 0; }
優化版
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 1010; int n, m; int v, w; int f[N]; int main() { cin >> n >> m; for(int i = 1; i <= n; i ++) { cin >> v >> w; for(int j = 1; j <= m; j ++) if(j >= v) f[j] = max(f[j], f[j - v] + w); } cout << f[m] << endl; return 0; }
2021.8.11 持續更新中