|
对于给定的std::vector<double> a = {1.0, 2.5, 3.7}和std::vector<double> b = {4.2, 5.0, 6.8},以及阈值l = 10,调用findMaxSumCombination(a, b, l)将返回std::vector<double> c = {1.0, 5.0, 3.7},其中c的和等于9.7,最大且小于l=10。- #include <iostream>
- #include <vector>
- void backtrack(const std::vector<double>& a, const std::vector<double>& b, std::vector<double>& c, int index, double sum, double threshold, double& maxSum) {
- if (sum > threshold) {
- return; // 当前组合的和已经大于阈值,剪枝
- }
-
- if (sum > maxSum) {
- maxSum = sum; // 更新最大和
- }
-
- if (index >= a.size() && index >= b.size()) {
- return; // 已经遍历完所有元素,结束递归
- }
-
- if (index < a.size()) {
- c.push采用back(a[index]); // 将a中的元素加入组合c
- backtrack(a, b, c, index + 1, sum + a[index], threshold, maxSum);
- c.pop采用back(); // 回溯,将a中的元素移出组合c
- }
-
- if (index < b.size()) {
- c.push采用back(b[index]); // 将b中的元素加入组合c
- backtrack(a, b, c, index + 1, sum + b[index], threshold, maxSum);
- c.pop采用back(); // 回溯,将b中的元素移出组合c
- }
- }
- std::vector<double> findMaxSumCombination(const std::vector<double>& a, const std::vector<double>& b, double threshold) {
- std::vector<double> c;
- double maxSum = 0.0;
- backtrack(a, b, c, 0, 0.0, threshold, maxSum);
- return c;
- }
复制代码
- // 回溯函数,寻找给定向量vec中元素的最大和组合,不超过阈值l
- static bool backtrack(std::vector<double>& result, const std::vector<double>& vec, size采用t index, double sum, double l) {
- // 基本情况:如果当前和等于阈值,说明找到了一个有效的组合
- if (sum == l) {
- result = vec;
- return true;
- }
- // 遍历向量中剩余的元素
- for (size采用t i = index; i < vec.size(); ++i) {
- // 跳过那些加上当前和会超过阈值的元素
- if (sum + vec[i] > l) {
- continue;
- }
- // 将当前元素添加到临时向量中,并递归地搜索其余部分
- std::vector<double> temp采用vec(vec.begin() + index, vec.begin() + i + 1);
- temp采用vec.push采用back(vec[i]);
- if (backtrack(result, temp采用vec, i + 1, sum + vec[i], l)) {
- return true;
- }
- }
- return false;
- }
- // 主函数,找到向量a中元素的最大和组合,不超过阈值l
- static std::vector<double> findMaxSumCombination(const std::vector<double>& a, double l) {
- std::vector<double> result;
- double current采用sum = 0.0;
- // 调用回溯函数,尝试找到满足条件的组合
- if (backtrack(result, a, 0, 0.0, l)) {
- return result;
- }
- return result;
- }
-
-
- //std::vector<double> a = {1.0, 2.5, 3.7, 4.2, 5.0, 6.8};
- //double l = 10.0;
- // std::vector<double> c = findMaxSumCombination(a, l);
- // c = {1.0, 3.7,5.0};
复制代码 |
|