我是靠谱客的博主 玩命皮卡丘,最近开发中收集的这篇文章主要介绍1799 Problem  A 第二题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

问题 A: 第二题

时间限制: 1 Sec  内存限制: 32 MB
提交: 83  解决: 0
[提交][状态][讨论版][命题人:外部导入]

题目描述

一个数组中有若干正整数,将此数组划分为两个子数组,使得两个子数组各元素之和a,b的差最小,对于非法输入应该输出ERROR。

输入

数组中的元素

输出

降序输出两个子数组的元素和

样例输入

10 20 30 10 10
10 20 abc 10 10

样例输出

40 40
ERROR
//测试可过but未AC,运行错误数组越界?
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
long long a[400000], dp[400000];
//思路:将数组求和得sum,分出一个数组使其接近sum/2,本质为01背包
//即从1-n物品中选取若干个,其重量不超过sum/2,且重量达最大
//dp[j]即在重量不超过j时所能达到的最大值
int main() {
string s;
while (getline(cin, s)) {
long long n = 1, sum = 0;
bool flag = false;
memset(a, 0, sizeof(a));
memset(dp, 0, sizeof(dp));
for (int i = 0; i < s.length(); i++) {
if (s[i] >= '0'&&s[i] <= '9') {
a[n] *= 10;
a[n] += s[i] - '0';
}
else if (s[i] == ' ') {
sum += a[n];
n++;
}
else {
flag = true;
break;
}
}
sum += a[n];
if (flag || n == 1) {
cout << "ERROR" << endl;
continue;
}
for (int 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]);
}
}
cout << sum - dp[sum / 2] << " " << dp[sum / 2] << endl;
}
return 0;
}

 

最后

以上就是玩命皮卡丘为你收集整理的1799 Problem  A 第二题的全部内容,希望文章能够帮你解决1799 Problem  A 第二题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部