ZOJ-1880

31 篇文章 0 订阅

又是一道DP题搞了一晚上,我去啊,DP实在是太菜了,这题应该算DP里很简单的了。。刚开始题意看错了,说是两个组里面人数差不能超过1,我去,没看到这个条件写了半天逻辑全错的,还对着测试数据看了半天没看出问题。。感觉我的算法很土。。就是记录了下每个可能和的所有组合个数,最后再统计下那种所用组合人数刚好为总人数一半的方案。。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>

using namespace std;

int main()
{
	int n;
	bool dp[25001];
	bool count[25001][52];
	while (scanf("%d", &n) != EOF)
	{
		memset(dp, 0, sizeof(dp));
		memset(count, 0, sizeof(count));
		count[0][0] = true;
		dp[0] = true;
		int w, sum = 0;
		for (int i = 0; i < n; i++)
		{
			scanf("%d", &w);
			sum += w;
			for (int j = 25000; j >= w; j--)
				if (dp[j - w])
				{
					dp[j] = true;
					for (int k = 0; k <= 50; k++)
						if (count[j - w][k])
							count[j][k + 1] = true;
				}
		}
		int mind = 99999, res;
		for (int i = 0; i <= 25000; i++)
			if (count[i][n / 2])
			{
				int temp = abs(sum - i - i);
				if (temp < mind)
				{
					mind = temp;
					res = i;
				}
			}
		printf("%d %d\n", min(res, sum - res), max(res, sum - res));
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值