function getCombBySum(array,sum,tolerance,targetCount){/*array: 数据源数组,必选;sum: 相加的和,必选;tolerance: 容差,如果不指定此参数,则相加的和必须等于sum参数,指定此参数可以使结果在容差范围内浮动,可选;targetCount: 操作数数量,如果不指定此参数,则结果包含所有可能的情况,指定此参数可以筛选出固定数量的数相加,假如指定为3,那么结果只包含三个数相加的情况,可选;返回值: 返回的是数组套数组结构,内层数组中的元素是操作数,外层数组中的元素是所有可能的结果;*/var util = {/*get combination from arrayarr: target arraynum: combination item lengthreturn: one array that contain combination arrays*//*获取所有的可能组合如果是[1,2,3,4,5]取出3个,那么可能性就有10种 C(5,3)= C(5,2)公式: 全排列  P(n,m)=n!/(n-m)!组合排列 P(n,m)=n!/m!/(n-m)!C(5,2)=5!/2!*3!=5*4*3*2*1/[(2*1)*(3*2*1)]=10这是使用了循环加递归做出了组合排序*/getCombination: function(arr, num) {  //  索引数组 操作数数量var r=[];(function f(t,a,n){if (n == 0) return r.push(t);for (var i=0,l=a.length; i<=l-n; i++) {f(t.concat(a[i]), a.slice(i+1), n-1);}})([],arr,num);return r;},// 获取数组的索引getArrayIndex: function(array) {var i = 0,r = [];for(i = 0;i<array.length;i++){r.push(i);}return r;}},logic = {//  对数组进行排序//  获取数组中比sum小的数init: function(array,sum) {  //初始化去除不可能的元素// clone arrayvar _array = array.concat(),r = [],i = 0;// sort by asc_array.sort(function(a,b){return a - b;});// 当它小于或等于总和时获得所有数字for(i = 0;i<_array.length;i++){if(_array[i]<=sum){r.push(_array[i]);}else{break;}}console.log('初始化后的数据源:', r);return r;},// important functioncore: function(array,sum,arrayIndex,count,r){var i = 0,k = 0,combArray = [],_sum = 0,_cca = [],_cache = [];if(count == _returnMark){return;}// 获取当前的计数总和// 这里排序的不是原来的数组,而是求的索引后的数组combArray = util.getCombination(arrayIndex,count);console.log('getCombination返回的值:', combArray);for(i = 0;i<combArray.length;i++){_cca = combArray[i];_sum = 0;_cache = [];// calculate the sum from combinationfor(k = 0;k<_cca.length;k++){_sum += array[_cca[k]];_cache.push(array[_cca[k]]);}if(Math.abs(_sum-sum) <= _tolerance){r.push(_cache);}      }logic.core(array,sum,arrayIndex,count-1,r);}},r = [],_array = [],_targetCount = 0,_tolerance = 0,_returnMark = 0;// check data_targetCount = targetCount || _targetCount;_tolerance = tolerance || _tolerance;_array = logic.init(array,sum);if(_targetCount){_returnMark = _targetCount-1;}console.log('_targetCount的值:', _targetCount);console.log('_returnMark的值:', _returnMark);logic.core(_array,sum,util.getArrayIndex(_array),(_targetCount || _array.length),r);return r;
}
var res1 = getCombBySum([1, 2, 3, 4, 5], 6, null, 2);
// var res2 = getCombBySum([1, 2, 3, 4, 5, 9, 7, 10, 8], 9, null, null);
console.log(res1);
// console.log(res2);

背包问题:从给定的无序、不重复的数组 A 中,取出N个数,使其相加和为M相关推荐

  1. java求数组中满足给定和的数对,【加试题】数组a中有50个互异的整数,已按升序排列。给定一个正整数key,寻找数组a中是否有一对数的和等于给定的数key,算法如下:...

    (1) 实现上述功能的VB程序如下,请在画线处填入合适代码. Dim a(1 To 50)As Integer Const n As Integer=50 Private sub form_load( ...

  2. 【组合数学】生成函数 ( 正整数拆分 | 无序不重复拆分示例 )

    文章目录 一.正整数拆分总结 二.正整数拆分示例 参考博客 : [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 | 与多 ...

  3. 【组合数学】生成函数 ( 正整数拆分 | 无序 | 有序 | 允许重复 | 不允许重复 | 无序不重复拆分 | 无序重复拆分 )

    文章目录 一.正整数拆分 二.无序拆分 1.无序拆分 不允许重复 2.无序拆分 允许重复 参考博客 : [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与 ...

  4. python重复元素判定_Python实现判断给定列表是否有重复元素的方法

    本文实例讲述了Python实现判断给定列表是否有重复元素的方法.分享给大家供大家参考,具体如下: 题目很简单,只是简单温习一个方法,most_common,这是collection模块中Counter ...

  5. python中set()函数==》创建一个无序不重复的元素集(创将一个集合)

    描述 set顾名思义是集合,里面不能包含重复的元素,接收一个可迭代对象作为参数 set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集.差集.并集等. 语法 set 语 ...

  6. [Python] set()函数 创建一个无序不重复元素集

    Python set()函数 创建一个无序不重复元素集 功能: set()函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集.差集.并集等. 语法: class set([it ...

  7. 46. 全排列:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

    题目描述 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 .你可以 按任意顺序 返回答案. 示例 1: 输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[ ...

  8. 在python中元素是无序不重复的_set()函数~~创建一个无序不重复元素集

    set()函数~~创建一个无序不重复元素集 2020-08-11 11:49常用函数 本篇文章里小编给大家分享了关于Python中set()函数的相关知识点内容,set() 函数用于创建一个无序不重复 ...

  9. 有序有重复、有序无重复、无序无重复、无序有重复区别详解及Python实现

    这几个概念理解起来有点困难,然而他们是整个概率论的基础.理解了他们的四个的区别,对于理解高阶概率论很有帮助. 本文是在学习Vamei 概率论01 计数 基础上得到的. 概率论的基础 大数定律(伯努利) ...

最新文章

  1. AI 一分钟 | 法拉第未来称年底前交付首量FF91,你还相信贾跃亭吗?
  2. json jsono wsdl_记录一下json的生成
  3. 登上Science子刊,神经科学再次启发DNN设计!中科院揭秘介观自组织反向传播机制...
  4. Android Studio 设置编辑器背景颜色
  5. 解决Springboot文件上传报错,java.io.FileNotFoundException: D:\System\Temp\tomcat.819...00.tmp (系统找不到指定的文件。)
  6. 中国互联网企业综合实力研究报告(2020)
  7. NOIP练习赛题目6
  8. 可太惨了吧!乐视网临时股东大会仅两位董事会成员出席,6分钟内结束
  9. apache字体文件跨域_在CabloyJS中将Webpack生成的文件自动上传到阿里云OSS
  10. 使用 PhyML 构建进化树
  11. Odoo 16 企业版手册 - CRM (1)
  12. BZOJ 2125 最短路 仙人掌最短路
  13. org.gradle.api.resources.ResourceException: Could not get resource ‘https://xxx.xxx/xxx.pom
  14. 地震预警信息接收服务器,震后9秒就发布信息 我省首次实现微博地震预警
  15. 为什么我喜欢用C++写算法
  16. uboot移植到IMX6ULL平台详细过程
  17. 办公室午休养精蓄锐良招
  18. 论文的选题、标题、摘要
  19. 2017-2018年度总结--梅花香自苦寒来
  20. 辽宁石化职业技术学院的计算机怎样,辽宁石化职业技术学院10大好专业推荐

热门文章

  1. shell--4、Shell 数组
  2. verilog实现多周期处理器之——(四)逻辑,移位操作与空指令的添加
  3. 三维点云学习(4)7-ransac 地面分割+ DBSCAN聚类比较
  4. mysql重复添加计数_从MySQL中的单个列获取重复值的计数?
  5. MongoDB副本集学习(一):概述和环境搭建
  6. java运算符重载_为什么Java不支持运算符重载?
  7. docker安装redis,使用jedis轻松操作redis
  8. springMVC包扫描失效,前端控制器加载异常
  9. SDL1.3(C语言)程序移植LINUX。。。
  10. 【破解】Flash Decompiler Trillix.4.1.1.720 破解补丁