解题思路:回溯回到底

注意事项:无

参考代码:

#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;


vector<int> sticks;

vector<bool> used;

int total_len;

int target;

int cnt;


// 回溯函数

bool backtrack(int cur_len, int finished) {

    if (finished == cnt) return true;

    for (int i = 0; i < sticks.size(); ++i) {

        if (used[i] || (i > 0 && !used[i - 1] && sticks[i] == sticks[i - 1]))

            continue;

        if (cur_len + sticks[i] > target)

            continue;

        used[i] = true;

        if (cur_len + sticks[i] == target) {

            if (backtrack(0, finished + 1)) return true;

        } else {

            if (backtrack(cur_len + sticks[i], finished)) return true;

        }

        used[i] = false;

        if (cur_len == 0) return false;

    }

    return false;

}


int main() {

    int n;

    cin >> n;

    sticks.resize(n);

    total_len = 0;

    for (int i = 0; i < n; ++i) {

        cin >> sticks[i];

        total_len += sticks[i];

    }

    sort(sticks.begin(), sticks.end(), greater<int>()); // 降序排序

    for (target = sticks[0]; target <= total_len; ++target) {

        if (total_len % target != 0)

            continue;

        cnt = total_len / target;

        used.assign(n, false); // 初始化used数组

        if (backtrack(0, 0)) {

            cout << target << endl; // 使用cout输出结果

            return 0;

        }

    }

    return 0;

}



点赞(1)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论