多重背包模板

xiaoxiao2021-02-28  113

#include<iostream> #include<cstring> #include<cstdio> #define MAXV 100001 #define MAXN 101 #define INF -100000000 using namespace std; int d[MAXV],weight[MAXN],cnt[MAXN],V; void OneZeroPack(int c,int w) { int i; for(i=V; i>=c; i--) d[i]=max(d[i],d[i-c]+w); } void CompletePack(int c,int w) { int i; for(i=c; i<=V; i++) d[i]=max(d[i],d[i-c]+w); } void MultPack(int c,int w,int n) { if(n*c>=V) { CompletePack(c,w); return ; } int k=1; while(k<=n) { OneZeroPack(k*c,k*w); n=n-k; k=k*2; } OneZeroPack(n*c,n*w); } int main() { int n,i; while(scanf("%d %d",&n,&V)==2&&(n||V)) { for(i=0;i<=V;i++) d[i]=INF; d[0]=0; for(i=0;i<n;i++) scanf("%d",&weight[i]); for(i=0;i<n;i++) scanf("%d",&cnt[i]); for(i=0;i<n;i++) MultPack(weight[i],weight[i],cnt[i]); int ans=0; for(i=1;i<=V;i++) if(d[i]>0) ans++; printf("%d\n",ans); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-45664.html

最新回复(0)