天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 53|回复: 0

找到满足条件的元素组合

[复制链接]
  • TA的每日心情
    开心
    前天 06:18
  • 签到天数: 49 天

    [LV.5]常住居民I

    185

    主题

    150

    回帖

    1695

    积分

    管理员

    积分
    1695
    发表于 2024-4-5 22:36:43 | 显示全部楼层 |阅读模式
    对于给定的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。
    1. #include <iostream>
    2. #include <vector>

    3. void backtrack(const std::vector<double>& a, const std::vector<double>& b, std::vector<double>& c, int index, double sum, double threshold, double& maxSum) {
    4.     if (sum > threshold) {
    5.         return;  // 当前组合的和已经大于阈值,剪枝
    6.     }
    7.    
    8.     if (sum > maxSum) {
    9.         maxSum = sum;  // 更新最大和
    10.     }
    11.    
    12.     if (index >= a.size() && index >= b.size()) {
    13.         return;  // 已经遍历完所有元素,结束递归
    14.     }
    15.    
    16.     if (index < a.size()) {
    17.         c.push_back(a[index]);  // 将a中的元素加入组合c
    18.         backtrack(a, b, c, index + 1, sum + a[index], threshold, maxSum);
    19.         c.pop_back();  // 回溯,将a中的元素移出组合c
    20.     }
    21.    
    22.     if (index < b.size()) {
    23.         c.push_back(b[index]);  // 将b中的元素加入组合c
    24.         backtrack(a, b, c, index + 1, sum + b[index], threshold, maxSum);
    25.         c.pop_back();  // 回溯,将b中的元素移出组合c
    26.     }
    27. }

    28. std::vector<double> findMaxSumCombination(const std::vector<double>& a, const std::vector<double>& b, double threshold) {
    29.     std::vector<double> c;
    30.     double maxSum = 0.0;
    31.     backtrack(a, b, c, 0, 0.0, threshold, maxSum);
    32.     return c;
    33. }
    复制代码



    1. // 回溯函数,寻找给定向量vec中元素的最大和组合,不超过阈值l
    2. static bool backtrack(std::vector<double>& result, const std::vector<double>& vec, size_t index, double sum, double l) {
    3.         // 基本情况:如果当前和等于阈值,说明找到了一个有效的组合
    4.         if (sum == l) {
    5.                 result = vec;
    6.                 return true;
    7.         }

    8.         // 遍历向量中剩余的元素
    9.         for (size_t i = index; i < vec.size(); ++i) {
    10.                 // 跳过那些加上当前和会超过阈值的元素
    11.                 if (sum + vec[i] > l) {
    12.                         continue;
    13.                 }

    14.                 // 将当前元素添加到临时向量中,并递归地搜索其余部分
    15.                 std::vector<double> temp_vec(vec.begin() + index, vec.begin() + i + 1);
    16.                 temp_vec.push_back(vec[i]);
    17.                 if (backtrack(result, temp_vec, i + 1, sum + vec[i], l)) {
    18.                         return true;
    19.                 }
    20.         }

    21.         return false;
    22. }

    23. // 主函数,找到向量a中元素的最大和组合,不超过阈值l
    24. static std::vector<double> findMaxSumCombination(const std::vector<double>& a, double l) {
    25.         std::vector<double> result;
    26.         double current_sum = 0.0;

    27.         // 调用回溯函数,尝试找到满足条件的组合
    28.         if (backtrack(result, a, 0, 0.0, l)) {
    29.                 return result;
    30.         }

    31.         return result;
    32. }


    33. //std::vector<double> a = {1.0, 2.5, 3.7, 4.2, 5.0, 6.8};
    34. //double l = 10.0;
    35. // std::vector<double> c = findMaxSumCombination(a, l);
    36. // c = {1.0, 3.7,5.0};
    复制代码

     

     

     

     

    找到满足条件的元素组合
    哎...膜结构车棚,签到来了1...
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-5-13 06:54 , Processed in 0.060224 second(s), 22 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表