TA的每日心情 | 无聊 昨天 10:41 |
---|
签到天数: 12 天 [LV.3]偶尔看看II
新手上路

- 积分
- 37
|
一、题目深度解读这是一个典型的组合优化问题: 二、DFS+剪枝算法框架预处理阶段:
核心递归逻辑: bool dfs(int remain, int target, int start) {
// 终止条件处理
// 遍历候选木棍
// 多重剪枝判断
}
五大剪枝策略:
长度单调性剪枝 相同长度跳过 失败长度记忆 首尾失败提前终止 长度下限优化
三、完整C++实现
- #include <algorithm>
- #include <iostream>
- #include <cstring>
- using namespace std;
- int sticks[70], n, sum;
- bool used[70];
- bool dfs(int remain, int target, int start) {
- if (remain == 0) return true;
- for (int i = start; i < n; i++) {
- if (used[i] || sticks[i] > target) continue;
- used[i] = true;
- if (sticks[i] == target) {
- if (dfs(remain-1, sum/(remain-1), 0))
- return true;
- } else if (dfs(remain, target-sticks[i], i+1))
- return true;
- used[i] = false;
- // 剪枝优化点
- if (target == sum/remain) break;
- while (i+1 <n && sticks[i+1]==sticks[i]) i++;
- }
- return false;
- }
- int main() {
- while (cin >> n && n) {
- sum = 0;
- for (int i = 0; i < n; i++) {
- cin >> sticks[i];
- sum += sticks[i];
- }
- sort(sticks, sticks+n, greater<int>());
- for (int len = sticks[0]; len <= sum; len++) {
- if (sum % len) continue;
- memset(used, 0, sizeof used);
- if (dfs(sum/len, len, 0)) {
- cout << len << endl;
- break;
- }
- }
- }
- return 0;
- }
复制代码
四、性能优化分析
来源:(CSP-J 2024真题)洛谷P11229小木棍:DFS剪枝优化实战指南 | 附完整注释代码
|
|