KTFinn 2023-04-21 20:16 采纳率: 45.5%
浏览 24

给定n个整数,请将这n个整数分为两部分(个数不一定要等),使得第一部分的和大于且尽量接近第二部分的和的两倍。

D98jc. 集合划分
时间限制:1.0s 内存限制:256.0MB 代码提交间隔:3分钟(现在可以提交)
输入文件名:sets.in 输出文件名:sets.out
问题描述
  给定n个整数,请将这n个整数分为两部分(个数不一定要等),使得第一部分的和大于且尽量接近第二部分的和的两倍。
输入格式
  从文件sets.in中读入数据。
  输入的第一行包含一个整数n。
  第二行包含n个整数,表示给定的数。
输出格式
  输出到文件sets.out中。
  你不需要输出具体的划分方案,只要输出第一部分的和减去第二部分的和的两倍的值。
样例输入
4
3 8 7 4
样例输出
1
样例说明
  3, 8, 4为一部分,7为另一部分,(3+8+4)–2×7=1。
数据规模和约定
  对于40%的数据,1 ≤ n ≤ 20,给定的每个数为不超过100的正整数。
  对于100%的数据,1 ≤ n ≤ 100,给定的每个数为不超过1000的正整数。

  • 写回答

2条回答 默认 最新

  • threenewbee 2023-04-21 20:36
    关注
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    
    const int MAXN = 20;
    int n;
    int a[MAXN];
    
    int solve(int k, int sum1, int sum2) {
        if (k == n) return abs(sum1 - 2 * sum2);
        int ans1 = solve(k + 1, sum1 + a[k], sum2); // 将a[k]分到第一部分
        int ans2 = solve(k + 1, sum1, sum2 + a[k]); // 将a[k]分到第二部分
        return min(ans1, ans2);
    }
    
    int main() {
        cin >> n;
        int sum = 0;
        for (int i = 0; i < n; i++) {
            cin >> a[i];
            sum += a[i];
        }
        cout << solve(0, 0, 0) << endl;
        return 0;
    }
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月21日

悬赏问题

  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Linux权限管理相关操作(求解答)
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表
  • ¥15 DbVisualizer Pro 12.0.7 sql commander光标错位 显示位置与实际不符
  • ¥15 android 打包报错
  • ¥15 关于stm32的问题
  • ¥15 ncode振动疲劳分析中,noisefloor如何影响PSD函数?