1 条题解
-
0
#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
- 上传者