bzoj1531[POI2005]Bank notes 多重背包

xiaoxiao2021-02-28  105

多重背包的裸题.复习一波。。 二进制拆分

#include<cstdio> #include<algorithm> #include<cstring> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) using namespace std; const int N=2e4+5; int n,m,b[300],c[300]; int f[N]; int main() { scanf("%d",&n); fo(i,1,n)scanf("%d",&b[i]); fo(i,1,n)scanf("%d",&c[i]); scanf("%d",&m); memset(f,0x3f,sizeof(f)); f[0]=0; fo(i,1,n) { for(int j=1;j<=c[i];j<<=1) { for(int k=m;k>=b[i]*j;k--) f[k]=min(f[k],f[k-b[i]*j]+j); c[i]-=j; } if (!c[i])continue; int j=c[i]; for(int k=m;k>=b[i]*j;k--) f[k]=min(f[k],f[k-b[i]*j]+j); } printf("%d\n",f[m]); }
转载请注明原文地址: https://www.6miu.com/read-39094.html

最新回复(0)