算法提高之混合背包问题
-
核心思想:三种背包 + 多重背包的二进制优化
- 二进制优化:k每次*=2
-
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int M = 1010; int f[M]; int n,m; int main() { cin>>n>>m; for(int i=0;i<n;i++) { int v,w,s; cin>>v>>w>>s; if(!s) for(int j=v;j<=m;j++) f[j] = max(f[j],f[j-v]+w); else { if(s == -1) s = 1; //01背包就是s=1的多重背包 for(int k=1;k<=s;k*=2) //二进制优化 { for(int j=m;j>=k*v;j--) f[j] = max(f[j],f[j-k*v]+k*w); s-=k; } if(s) //如果还有剩余 全放进去 { for(int j=m;j>=v*s;j--) f[j] = max(f[j],f[j-s*v]+s*w); } } } cout<<f[m]<<endl; }