1.8大基本資料型別及其包裝型別的常量池技術,字串常量池
阿新 • • 發佈:2022-03-22
#include<iostream> #include<vector> using namespace std; typedef long long ll; const int N = 5e6 + 4; ll n, V, f[N], v[N], w[N], cnt[N]; struct Node { ll v, w, cnt; }; vector<Node>p; void work() { cin >> n >> V; //物品種類數和揹包體積 for(int i = 1; i <= n; i++) { ll v, w, c; cin >> v >> w >> c; //體積,價值,數量 if(c > 0) //有限 { for(int k = 1; k <= c; k <<= 1) //轉化成單個揹包,並利用可組合的性質 { c -= k; p.push_back({k * v, k * w, -1}); } if(c > 0) //湊不成單1,也加進去,為了湊出c { p.push_back({c * v, c * w, -1}); } } else p.push_back({v, w, c}); //1個或者無限 } for(auto tmp: p) { if(tmp.cnt == -1) { for(int k = V; k >= tmp.v; k--) { f[k] = max(f[k], f[k - tmp.v] + tmp.w); } } if(tmp.cnt == 0) { for(int k = tmp.v; k <= V; k++) { f[k] = max(f[k], f[k - tmp.v] + tmp.w); } } } cout<<f[V]; }