天气与日历 切换到窄版

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

找到满足条件的元素组合

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 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};
复制代码

 

 

 

 

找到满足条件的元素组合
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 08:38 , Processed in 0.136666 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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