天气与日历 切换到窄版

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

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

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-3-13 16:43:47 | 显示全部楼层 |阅读模式
  1. static int getMaxNotMoreThanTarget(int a, int b, int target) {
  2.                 //如果两个数都大于目标值,返回0
  3.                 if (target < a && target < b) {
  4.                         return 0;
  5.                 }
  6.                 //如果一个数大于目标值,一个数小于目标值,返回小于目标值的的数
  7.                 if (target < a) {
  8.                         return b;
  9.                 }
  10.                 if (target < b) {
  11.                         return a;
  12.                 }
  13.                 //两个数都小于目标值返回较大值
  14.                 return a > b ? a : b;
  15.         }
  16.         static int getSum(vector<int> array, int start) {
  17.                 int sum = 0;
  18.                 for (int i = start; i < array.size(); i++) {
  19.                         sum += array[i];
  20.                 }
  21.                 return sum;
  22.         }
  23.         static int getSumClosestToTarget(vector<int> array, int start, int target) {
  24.                 //目标值小于0,不可能有这种情况,因为工时都是正整数
  25.                 if (target < 0) {
  26.                         return 0;
  27.                 }
  28.                 //如果当前数组全部之和小于目标值直接返回
  29.                 int sum = getSum(array, start);
  30.                 if (sum <= target) {
  31.                         return sum;
  32.                 }
  33.                 //取两部分较大值
  34.                 return getMaxNotMoreThanTarget(getSumClosestToTarget(array, start + 1,
  35.                         target - array[start]) + array[start]
  36.                 , getSumClosestToTarget(array, start + 1, target)
  37.                         , target);
  38.         }
复制代码

 

 

 

 

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

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
 楼主| 发表于 2024-3-13 16:44:11 | 显示全部楼层
  1.         int target = 371;
  2.                 backtrack(sssa, target, 0, 0, 0,maxSum);
  3. static        void backtrack(vector<int>& nums, int target, int start, int count, int sum,int &maxSum) {
  4.                 if (sum > target) {
  5.                         return;
  6.                 }
  7.                 maxSum = max(maxSum, sum);
  8.                 if (count == nums.size()) {
  9.                         return;
  10.                 }
  11.                 for (int i = start; i < nums.size(); i++) {
  12.                         sum += nums[i];
  13.                         backtrack(nums, target, i + 1, count + 1, sum , maxSum);
  14.                         sum -= nums[i];
  15.                 }
  16.         }
复制代码

 

 

 

 

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

本版积分规则

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

GMT+8, 2024-11-1 11:41 , Processed in 0.128785 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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