BZOJ 1531 二进制优化多重背包
思路:
讲道理我应该写单调队列优化多重背包的
但是我不会啊
但是我现在! 还不会啊
我就写了个二进制优化的..
过了
//By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n,cpy[222],b[3333],c[3333],f[20001],jy,xx,top,k; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&cpy[i]); for(int i=1;i<=n;i++){ scanf("%d",&xx),jy=0; while(xx){ if(xx>=(1<<jy))c[++top]=(1<<jy),xx-=(1<<jy); else c[++top]=xx,xx=0; b[top]=cpy[i]*c[top],jy++; } } scanf("%d",&k); memset(f,0x3f,sizeof(f)),f[0]=0; for(int i=1;i<=top;i++) for(int j=k;j>=b[i];j--) f[j]=min(f[j],f[j-b[i]]+c[i]); printf("%d\n",f[k]); }