标签:mes end wing code mem const out 混合背包 01背包
#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; }
标签:mes end wing code mem const out 混合背包 01背包
原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12003907.html