AcWing 7. 混合背包问题
Posted qingyuyyyyy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing 7. 混合背包问题相关的知识,希望对你有一定的参考价值。
#include<iostream> #include<algorithm> #include<cstring> using namespace std ; const int N=1010; int f[N],g[N],q[N]; int n,m; int a[N]; int main() { cin>>n>>m; for(int i=1; i<=n; i++) { int v,w,s; cin>>v>>w>>s; if(s==0) { //完全背包 for(int j=v; j<=m; j++) f[j]=max(f[j],f[j-v]+w); } else { if(s==-1)//如果是01背包 s=1;//换成s就只有1 memcpy(g,f,sizeof f); for(int j=0; j<v; j++) { int hh=0,tt=-1; for(int k=j; k<=m; k+=v) { if(hh<=tt&&q[hh]<k-s*v) hh++; if(hh<=tt) f[k]=max(f[k],g[q[hh]]+(k-q[hh])/v*w); while(hh<=tt&&g[q[tt]]-(q[tt]-j)/v*w<=g[k]-(k-j)/v*w) tt--; q[++tt]=k; } } } } cout<<f[m]<<endl; return 0; }
以上是关于AcWing 7. 混合背包问题的主要内容,如果未能解决你的问题,请参考以下文章