P2392 kkksc03考前临时抱佛脚

点击查看代码
#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;
}
posted @ 2026-01-06 14:36  gosaky  阅读(4)  评论(0)    收藏  举报