思路:
讲道理我应该写单调队列优化多重背包的
但是我不会啊
但是我现在! 还不会啊
我就写了个二进制优化的..
过了
//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]); }