AcWing 7. 混合揹包問題
阿新 • • 發佈:2021-12-13
#include <bits/stdc++.h> using namespace std; const int N = 100010; int n; //物品種類 int m; //揹包容量 int v[N]; //物品體積 int w[N]; //物品價值 int f[N]; //dp陣列 int main() { cin >> n >> m; int cnt = 1; //n類物品 for (int i = 1; i <= n; i++) { int a, b, s; //體積,價值,個數 cin >> a >> b >> s; if (s < 0)s = 1; //題目中s=-1表示只有1個 else if (s == 0)s = m / a; //完全揹包:最多總體積/該物品體積向下取整 //將01揹包和完全揹包利用二進位制優化轉化為多重揹包 int k = 1; while (k <= s) { v[cnt] = a * k; w[cnt] = b * k; s -= k; k *= 2; cnt++; } if (s > 0) { v[cnt] = s * a; w[cnt] = s * b; cnt++; } } //01揹包模板 for (int i = 1; i <= cnt; i++) for (int j = m; j >= v[i]; j--) f[j] = max(f[j], f[j - v[i]] + w[i]); //輸出大吉 printf("%d", f[m]); return 0; }