点击查看代码
#include <bits/stdc++.h>
using namespace std;
//s是学科数,a是题目个数
int s[4], a[25];
int n, sum, now_ans, final_ans;
//1.状态定义,x是已经处理的题目个数,left是左脑处理的题目时间
void dfs(int x, int left) {
//2.剪枝,如果左脑耗时已经超过了一般那就没有必要再选了,再给左脑一定耗时更久
if (left > sum / 2) {
now_ans = min(now_ans, left);
return;
}
// 3.边界,题目枚举完毕
if (x > n) {
now_ans = min(now_ans, sum-left);
return;
}
//4.枚举选择,这里是选或者不选
dfs(x + 1, left + a[x]);
dfs(x + 1, left);
}
//这里因为是传参,所以回溯隐去了
int main() {
cin >> s[0] >> s[1] >> s[2] >> s[3];
for (int i = 0; i < 4; i++) {
n = s[i];
sum = 0;
now_ans = 1e9; // 每次重置最大值
for (int j = 1; j <= n; j++) {
cin >> a[j];
sum += a[j];
}
dfs(1, 0);
final_ans += now_ans;
}
cout << final_ans << endl;
return 0;
}