UVA--562 Dividing coins(01背包)

题目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 ",sum-2*dp[sum/2]);
  }
  return 0;
}






原文地址:https://www.cnblogs.com/gt123/p/3460650.html