代码改变世界

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;
}