天气与日历 切换到窄版

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

取数组中n个数之和为不大于目标值的最大值

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-3-15 23:15:24 | 显示全部楼层 |阅读模式
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. std::pair<int, std::vector<int>> findMaxSumBelowLimit(const std::vector<double>& numbers, double limit) {
  5.     std::pair<int, std::vector<int>> bestSumAndCombination{0, {}};
  6.     std::vector<bool> used(numbers.size(), false);
  7.     std::vector<int> combination;
  8.     backtrack(numbers, limit, used, combination, 0, 0, bestSumAndCombination);
  9.     return bestSumAndCombination;
  10. }
  11. void backtrack(const std::vector<double>& numbers, double limit, std::vector<bool>& used,
  12.                std::vector<int>& combination, size采用t index, int currentSum,
  13.                std::pair<int, std::vector<int>>& bestSumAndCombination) {
  14.     if (currentSum > limit) {
  15.         return; // 如果当前和大于限制,直接返回
  16.     }
  17.     if (index == numbers.size()) {
  18.         if (currentSum > bestSumAndCombination.first) {
  19.             bestSumAndCombination.first = currentSum;
  20.             bestSumAndCombination.second = combination;
  21.         }
  22.         return;
  23.     }
  24.     // 不选当前数
  25.     backtrack(numbers, limit, used, combination, index + 1, currentSum, bestSumAndCombination);
  26.     // 选当前数
  27.     if (!used[index]) {
  28.         used[index] = true;
  29.         combination.push采用back(index);
  30.         backtrack(numbers, limit, used, combination, index + 1, currentSum + static采用cast<int>(numbers[index]), bestSumAndCombination);
  31.         used[index] = false;
  32.         combination.pop采用back();
  33.     }
  34. }
  35. int main() {
  36.     std::vector<double> numbers = {1, 2, 5, 16.3, 22.7, 32.6, 40, 53.1};
  37.     double limit = 100;
  38.    
  39.     auto result = findMaxSumBelowLimit(numbers, limit);
  40.    
  41.     std::cout << "The maximum sum within the limit is: " << result.first << std::endl;
  42.     std::cout << "The combination with this sum is: [";
  43.     for (size采用t i : result.second) {
  44.         std::cout << numbers[i] << " ";
  45.     }
  46.     std::cout << "]" << std::endl;
  47.     return 0;
  48. }
复制代码

 

 

 

 

取数组中n个数之和为不大于目标值的最大值

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
 楼主| 发表于 2024-3-15 23:18:00 | 显示全部楼层
  1. static  std::pair<double, std::vector<double>> findMaxSumBelowLimit(const std::vector<double>& numbers, double limit) {
  2.         std::vector<double> temp;
  3.         std::pair<double, std::vector<double>> bestSumAndCombination;
  4.         bestSumAndCombination=(std::make采用pair(1, temp));
  5.         std::vector<bool> used(numbers.size(), false);
  6.         std::vector<double> combination;
  7.         backtrack(numbers, limit, used, combination, 0, 0, bestSumAndCombination);
  8.         return bestSumAndCombination;
  9. }
  10. static void backtrack(const std::vector<double>& numbers, double limit, std::vector<bool>& used,
  11.                            std::vector<double>& combination, int index, double currentSum,
  12.                            std::pair<double, std::vector<double>>& bestSumAndCombination) {
  13.                                    if (currentSum > limit) {
  14.                                            return; // 如果当前和大于限制,直接返回
  15.                                    }
  16.                                    if (index == numbers.size()) {
  17.                                            if (currentSum > bestSumAndCombination.first) {
  18.                                                    bestSumAndCombination.first = currentSum;
  19.                                                    bestSumAndCombination.second = combination;
  20.                                            }
  21.                                            return;
  22.                                    }
  23.                                    // 不选当前数
  24.                                    backtrack(numbers, limit, used, combination, index + 1, currentSum, bestSumAndCombination);
  25.                                    // 选当前数
  26.                                    if (!used[index]) {
  27.                                            used[index] = true;
  28.                                            combination.push采用back( numbers[index]  );
  29.                                            backtrack(numbers, limit, used, combination, index + 1, currentSum + numbers[index] , bestSumAndCombination);
  30.                                            used[index] = false;
  31.                                            combination.pop采用back();
  32.                                    }
  33. }
  34.                 vector<double> sssa{20.1,19.3,15.4,13.3,10.3,9.1}
  35.                 double limit = 100.15;
  36.                 auto result = findMaxSumBelowLimit(sssa, limit);
复制代码

 

 

 

 

取数组中n个数之和为不大于目标值的最大值
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-1 07:14 , Processed in 0.176128 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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