题目大意:多重背包
一大早就水了个题233
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 20200 using namespace std; int n,k,b[220],c[220]; int f[M]; int main() { int i,j,k; cin>>n; for(i=1;i<=n;i++) scanf("%d",&b[i]); for(i=1;i<=n;i++) scanf("%d",&c[i]); cin>>::k; memset(f,0x3f,sizeof f); f[0]=0; for(i=1;i<=n;i++) { for(j=1;j<=c[i];j<<=1) { for(k=::k;k>=b[i]*j;k--) f[k]=min(f[k],f[k-b[i]*j]+j); c[i]-=j; } if(!c[i]) continue; j=c[i]; for(k=::k;k>=b[i]*j;k--) f[k]=min(f[k],f[k-b[i]*j]+j); } cout<<f[::k]<<endl; return 0; }
时间: 2024-12-19 00:36:29