目录
题目描述
愚公留下遗愿,让他的两个儿子愚大和愚二完成他移山的愿望:将石头搬出大山。一直以来,愚大背大石头,将小石头留给弟弟愚二背。愚二长大后,想分担哥哥的负担,要求背大石头,让哥哥背小石头。愚大不同意。兄弟二人多次讨论,也不能提出一个公平背石头的方案。
假设有 nnn 块石头,将这 nnn 个石头尽可能平分给兄弟二人,即两人分得的石头重量差异最小。请你帮助愚家兄弟解决这个问题。
输入
多组输入,对于每组数据:
第一行,一个整数 nnn (3≤n≤1000)(3 \le n \le 1000)(3≤n≤1000),表示石头的数目;
第二行,nnn 个整数,对于每个整数 aia_iai (1≤ai≤50)(1 \le a_i \le 50)(1≤ai≤50),表示第 iii 块石头的重量。
输出
对于每组输入,输出两个数 x,yx, yx,y (x≤y)(x \le y)(x≤y),分别表示两个兄弟背的石头总重量。
输入输出样例
样例输入 #1
3
1 2 3
样例输出 #1
3
思路
也就是把石头的和除以2,让其中一个人最接近那个中间值,也就是01背包了!
该上代码了
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
int sum = 0;
int num = 0;
int dp[50000];
int a[1005];
int n;
int main()
{
while (cin >> n)
{
sum = 0;
num = 0;
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++)
{
cin >> a[i];
sum += a[i];
}
num = sum / 2;
for (int i = 1; i <= n; i++)
{
for (int j = num; j >= 1; j--)
{
if (j >= a[i])
dp[j] = max(dp[j], dp[j - a[i]] + a[i]);
}
}
cout << dp[num] << " " << sum - dp[num] << endl;
}
return 0;
}
明天就是儿童节,希望大家写代码时也要保持一颗童心哦!!!