oj1010: 魔兽争霸之最后的反击

题目要求
相传人族与兽族对峙了很久,双方均受到了重创,兽族趁人类没有能力发起大规模进攻之时突然袭击,想一次彻底打败人族。人类为了生存,无论老幼伤病,全部参战,兵分两路抗敌。
由于体质不同,我们以血量表示一个人的战斗力,现在给你所有人的血量,请你把人类分成战斗力最接近的两部分。注意,战斗力要最接近,不然,人族会因你而战败呦!

Input
第一行为一个整数n(1<=n<=36),表示人族的总人数。以下的n行每行一个整数,表示一个人的血量mi(即战斗力),其中1<=mi<=400.
Output
只有一行,包含两个数,即人族的每部分兵的血量总和,较小的一个值放在前面,两个数用空格分隔。
Sample Input
Raw
3
20
32
35
Sample Output
Raw
35 52
首先寻找理想的中值mid,再利用动态规划中的背包问题思路,让背包的承重量设置为mid的值,不断寻找一边的最大值max.

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<math.h>
#include<stdio.h>
#include<string.h>
using namespace std;
int max(int a, int b)
{
	if (a >= b)
		return a;
	else
		return b;
}
int main()
{
	int dp[1000], num, a[1000], sum = 0, mid;
	memset(a, 0, sizeof(a));
	memset(dp, 0, sizeof(dp));
	cin >> num;
	for (int i = 1; i <= num; i++)
	{
		cin >> a[i];
		sum += a[i];
	}
	mid = sum / 2;
	for (int i = 1; i <= sum; i++)
		for (int j = mid; j >= 0; j--)
			if (j >= a[i])
				dp[j] = max(dp[j], dp[j - a[i]] + a[i]);
	cout << dp[mid] << " " << sum - dp[mid] << endl;
	return 0;	
}
发布了38 篇原创文章 · 获赞 27 · 访问量 3187

猜你喜欢

转载自blog.csdn.net/qq_45891413/article/details/104865258