KTFinn 2023-04-19 20:32 采纳率: 45.5%
浏览 8
已结题

关于#set#的问题,如何解决?

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的正整数。

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 110, M = 33010;

int n;
int a[N];
int f[M];

int main()
{
    int sum = 0;
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        cin >> a[i];
        sum += a[i];
    }

    int v = (sum + 1) / 2;

    memset(f, -0x3f, sizeof f);
    f[0] = 0;
    for(int i = 0; i < n; i++)
        for(int j = v; j >= a[i]; j--)
            f[j] = max(f[j], f[j - a[i]] + a[i]);

    int res = abs(sum - 2 * f[v]);

    cout << res << endl;
    return 0;
}

0分,帮帮我

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-04-19 22:30
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月29日
  • 已采纳回答 4月21日
  • 创建了问题 4月19日

悬赏问题

  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害