简单的多重背包。
我想先把HDU上背包问题AC掉 ;)
/*
* hdu-1171 big event in hdu
* mike-w
* 2011-10-10
* -------------------------
* 多重背包
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define MAXW 999999
#define MAXN 50
long cnt[MAXN],value[MAXN];
long opt[MAXW];
long total;
long N;
long maxw;
int main(void)
{
long i,j,tn,tv;
#ifndef ONLINE_JUDGE
freopen("1171.in","r",stdin);
#endif
while(scanf("%ld",&N),N>=0)
{
total=0;
for(i=0;i<N;i++)
scanf("%ld%ld",value+i,cnt+i),total+=value[i]*cnt[i];
maxw=total/2;
for(i=0;i<=maxw;i++)
opt[i]=-1;
opt[0]=0;
for(i=0;i<N;i++)
{
for(tv=value[i],tn=1;tn<=cnt[i];tn<<=1,tv<<=1)
{
for(j=maxw;j>=tv;j--)
if(opt[j-tv]>=0 && opt[j]<opt[j-tv]+tv)
opt[j]=opt[j-tv]+tv;
}
tn=cnt[i]-(tn>>1);
if(tn>0)
{
tv=tn*value[i];
for(j=maxw;j>=tv;j--)
if(opt[j-tv]>=0 && opt[j]<opt[j-tv]+tv)
opt[j]=opt[j-tv]+tv;
}
}
for(i=maxw;i>=0;i--)
if(opt[i]>=0)
printf("%ld %ld\n",total-opt[i],opt[i]),i=-1;
}
return 0;
}
本文详细阐述了如何解决HDU上的背包问题,并通过实例代码展示了多重背包的解决方法。
5万+

被折叠的 条评论
为什么被折叠?



