测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A25817. 分配

填空题 中等

题目描述

分配

题目描述

疫情期间,社会爱心人士及单位组织为疫情捐赠了大量物资。其中有n箱口罩物资需要小蓝为2个疫情重灾区分配。每箱口罩的数量也不完全相等,且只能整箱分配。为了公平,尽量使2个疫情重灾区分得的口罩数量相等,也就是2个疫情区分得的口罩数量差值最小。

例如:n为3,3箱口罩数量分别为200、300、110,按照要求分配,2个疫情区分得的口罩数量分别为310(200+110)和300。

这时小蓝犯愁了,不知道如何才能使2个疫情重灾区分得的口罩数量尽量接近。请你编写程序帮助小蓝解决这个问题。

输入描述

第一行输入一个正整数n(n≤10),表示有n箱口罩。

第二行输入n个不完全相等的正整数(100≤每个正整数≤1000),表示每箱口罩的数量。正整数之间以一个空格隔开。

输出描述

输出两个正整数,分别表示2个重灾区分得口罩的数量,两个正整数之间一个空格隔开,且如果两个正整数不相同,需按照从大到小输出。

样例输入

3
200 300 110

样例输出

310 300

参考答案

#include <algorithm> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> using namespace std; int a[20]; int n; int sum; int ans; void check(int x) { int tmp = 0; for (int i = 0; i < n; ++i) { if ((x >> i) & 1) { tmp += a[i + 1]; } } if (abs(sum - tmp - tmp) < abs(sum - ans - ans)) { ans = tmp; } } int main() { cin >> n; for (int i = 1; i <= n; ++i) { cin >> a[i]; sum += a[i]; } for (int i = 0; i < (1 << n); ++i) { check(i); } int a1 = ans; int a2 = sum - ans; if (a1 < a2) { swap(a1, a2); } cout << a1 << " " << a2 << endl; return 0; }
上一题 下一题