多重背包的二进制优化——DP
#include<cstdio> #include<cstring> #include<algorithm> #define LL long long using namespace std; const int M=2e5+7; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f; } int n,V; int cnt,w[M],v[M],f[M]; int main(){ int x,y,c,sum; n=read(); V=read(); for(int i=1;i<=n;i++){ x=read(); y=read(); c=read(); sum=0; for(int k=0;(1<<k)<=c;k++){ if(sum+(1<<k)<=c){ sum=sum+(1<<k); cnt++; v[cnt]=x*(1<<k); w[cnt]=y*(1<<k); } } if(sum<c) cnt++,v[cnt]=(c-sum)*x,w[cnt]=(c-sum)*y; } for(int i=1;i<=cnt;i++) for(int x=V;x>=v[i];x--) f[x]=max(f[x],f[x-v[i]]+w[i]); printf("%d\n",f[V]); return 0; }