您的位置:首页 > 其它

多重背包模板

2017-08-06 11:04 323 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: