Codeup100000632问题 A: 第二题

这篇博客探讨了一种解决数组元素划分问题的方法,旨在使两个子数组的元素之和差值最小。通过实现一个名为`dfs`的贪心算法,避免了动态规划可能导致的数组越界问题。博客中提供了示例输入和输出,并解释了当输入包含非法字符时,程序会输出`ERROR`。代码示例展示了如何将字符串转换为整数数组并进行递归搜索,以找到最佳的子数组划分。
摘要由CSDN通过智能技术生成

题目描述:

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

输入:

数组中的元素

输出:

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

样例输入:

10 20 30 10 10
10 20 abc 10 10

样例输出:

40 40
ERROR

实现代码:

#include<cstdio>
#include<string>
#include<iostream>
#include<cstring>
using namespace std;

const int maxn = 1e3 + 10;
string str;
int data[maxn];

int strToArray(int &sum) {
    memset(data, 0, sizeof(data));
    int num = 0;
    for(int i = 0; i < str.size(); i++) {
        if(str[i] >= '0' && str[i] <= '9') {
            data[num] = data[num] * 10 + str[i] - '0';
        } else if(str[i] == ' ') {
            sum += data[num];
            num++;
        } else {
            return 0;
        }
    }
    sum += data[num];
    num++;
    return num;
}

//dfs函数用于贪心算法,每次取或者不取该数,使最终结果最接近half或者等于half(注意最终结果一定小于等于half)
void dfs(int index, int ans, int half, int num, int &res) {
    if(index == num) {
        return;
    }
    if(ans + data[index] <= half) {
        res = max(res, ans + data[index]);
        if(res == half) {
            return;
        }
        dfs(index + 1, ans + data[index], half, num, res);
    }
    dfs(index + 1, ans, half, num, res);
}

int main() {
    while(getline(cin, str)) {
        int sum = 0;
        int num = strToArray(sum);
        if(num == 0) {
            printf("ERROR\n");
            continue;
        }
        int res = 0;
        dfs(0, 0, sum / 2, num, res);
        printf("%d %d\n", sum - res, res);
    }
    return 0;
}

/*
    此题用动态规划解决0-1背包问题会导致数组越界,因此可以采用贪心算法来解决。
    由于要求俩个子数组差值最小,那么要么俩子数组相等,要么一个略大于总和的一半,一个略小于
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值