hdu 1171 Big Event in HDU 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1171
题目大意:分家,重型设备什么的没法一劈两半,所以要按价值来尽量分成相近的两堆(相等当然最好)。
题目分析:多重背包,价值即重量。
code:
#include<stdio.h>
#include<string.h>
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int i,j,k,ans,dp[100010],a[1010],c[1010],n,sum;
while(scanf("%d",&n),n>=0)
{
for(sum=i=0;i<n;i++)
{
scanf("%d%d",&a[i],&c[i]);
sum+=a[i]*c[i];
}
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
{
if(a[i]*c[i]>=sum/2)
{
for(j=a[i];j<=sum/2;j++)
{
dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
}
continue;
}
for(k=1;k<c[i];c[i]-=k,k<<1)
for(j=sum/2;j>=a[i]*k;j--)
dp[j]=max(dp[j],dp[j-a[i]*k]+a[i]*k);
for(j=sum/2;j>=a[i];j--)
dp[j]=max(dp[j],dp[j-c[i]*a[i]]+a[i]*c[i]);
}
printf("%d %d\n",sum-dp[sum/2],dp[sum/2]);
}
return 0;
}
PS:人家都是用母函数做的……