UVA562(平分钱币问题)

http://blog.csdn.net/woshi250hua/article/details/7605673

题目大意给定n个硬币,要求将这些硬币平分以使两个人获得的钱尽量多,求两个人分到的钱最小差值。

思路:将它所给出的n个钱币加起来sum,将sum/2当作体积,求出在sum/2下的最大值,sum-2*dp[sum/2];这个题目wa几次,原因就是数组开小了,悲催的英文题,表示看不懂........

 

#include<iostream>

#include<stdio.h>

#include<string.h>

#include<math.h>

using namespace std;

#define max(x,y) (x>y? x:y)

int dp[100000],a[100000];

int main()

{

	int text;

	scanf("%d",&text);

	while(text--)

	{

		int n;

		scanf("%d",&n);

		int i,sum=0;

		for(i=1;i<=n;i++)

		{

			scanf("%d",&a[i]);

			sum+=a[i];

		}

		memset(dp,0,sizeof(dp));

		for(i=1;i<=n;i++)

		{

			for(int j=sum/2;j>=a[i];j--)

				dp[j]=max(dp[j],dp[j-a[i]]+a[i]);

		}

		//printf("%d\n",dp[sum/2]);

		printf("%d\n",sum-2*dp[sum/2]);

	}

	return 0;

}

 

 

 

你可能感兴趣的:(uva)