UVA--562 Dividing coins(01背包)
2013-12-06 00:32 gongti 阅读(158) 评论(0) 收藏 举报
题目http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=503
分析:两个人平分硬币,要求最后两者的差值最小。
相当于一个人利用背包获得硬币,背包的容量相当于总价值的一半。
#include<stdio.h>
#include<string.h>
int main()
{
int t,n,v[101],dp[50010],sum;
scanf("%d",&t);
while (t--)
{
//获取数据
scanf("%d",&n);
sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&v[i]);
sum+=v[i];
}
//数据初始化
memset(dp,0,sizeof(dp));
//利用公式进行递推
for(int i=1;i<=n;i++)
for(int j=sum/2;j>=v[i];j--)
dp[j]=dp[j]>dp[j-v[i]]+v[i]?dp[j]:dp[j-v[i]]+v[i];
printf("%d\n",sum-2*dp[sum/2]);
}
return 0;
}
浙公网安备 33010602011771号