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

#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;
}