您的位置:首页 > 其它

HDU 1171 Big Event in HDU

2012-07-26 10:44 323 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1171

多重背包,学自背包九讲。

re一次,dp数组开多大算起来太纠结,尽可能开大就不会有事了

wa一次,dp数组没有memset。。。

View Code

#include <iostream>
using namespace std ;
int dp[1000001] ;
int v[51],num[101] ;
int V ;
void ZeroOnePack(int c,int w)
{
for(int i=V;i>=c;i--)
dp[i]=max(dp[i],dp[i-c]+w) ;
return ;
}
void CompletePack(int c,int w)
{
for(int i=c;i<=V;i++)
dp[i]=max(dp[i],dp[i-c]+w) ;
return ;
}
void MultiplePack(int c,int w,int a)
{
if(c*a>=V)
{
CompletePack(c,w) ;
return ;
}
int k=1 ;
while(k<a)
{
ZeroOnePack(k*c,k*w) ;
a-=k ;
k<<=1 ;
}
ZeroOnePack(a*c,a*w) ;
}
int main()
{
int n ;
while(scanf("%d",&n),n>0)
{
int sum=0 ;
memset(dp,0,sizeof(dp)) ;
for(int i=0;i<n;i++)
{
scanf("%d%d",&v[i],&num[i]) ;
sum+=v[i]*num[i] ;
}
V=sum>>1 ;
for(int i=0;i<n;i++)
MultiplePack(v[i],v[i],num[i]) ;
if(dp[V]>sum-dp[V])
printf("%d %d\n",dp[V],sum-dp[V]) ;
else
printf("%d %d\n",sum-dp[V],dp[V]) ;
}
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: