1 条题解

  • 0
    @ 2026-1-31 21:08:20
    #include<bits/stdc++.h>
    using namespace std;
    
    // [1] 全局变量定义
    int n, b;             // n: 奶牛的数量, b: 书架的高度
    int arr[100];         // arr: 存储每头奶牛的身高
    int min_sum = INT_MAX;// min_sum: 记录满足条件的最小奶牛塔高度,初始化为极大值
    
    // [2] 深度优先搜索函数,用于枚举所有奶牛组合的高度
    // x: 当前处理到第x头奶牛(从0开始), len: 当前已选奶牛的总高度
    void dfs(int x, int len) {
        // [2-1] 递归终止条件:所有奶牛都处理完毕
        if (x == n) {
            // 如果当前总高度满足要求(>=书架高度),更新最小高度
            if (len >= b) {
                min_sum = min(min_sum, len);
            }
            return;
        }
    
        // [2-2] 剪枝:当前总高度已经大于等于已知的最小满足条件高度,无需继续递归
        if (len >= min_sum) {
            return;
        }
    
        // [2-3] 提前更新:如果当前总高度已经满足要求,直接更新最小高度并返回
        if (len >= b) {
            min_sum = min(min_sum, len);
            return;
        }
    
        // [2-4] 选择第x头奶牛,累计高度增加arr[x],继续处理下一头
        dfs(x + 1, len + arr[x]);
        // [2-5] 不选择第x头奶牛,高度不变,继续处理下一头
        dfs(x + 1, len);
    }
    
    int main() {
        // [3] 输入处理:读取奶牛数量n和书架高度b
        cin >> n >> b;
        // [4] 读取每头奶牛的身高并存储到数组arr
        for (int i = 0; i < n; ++i) {
            cin >> arr[i];
        }
    
        // [5] 对奶牛身高降序排序,优先选高的奶牛,让剪枝更高效
        sort(arr, arr + n, greater<int>());
    
        // [6] 调用dfs,从第0头奶牛开始,初始总高度为0
        dfs(0, 0);
    
        // [7] 输出最小高度与书架高度的差值,即超出书架的最小高度
        cout << min_sum - b << endl;
    
        return 0;
    }
    
    • 1

    信息

    ID
    1274
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    1
    上传者