查找总数等于N的所有值的组合(javascript)

查找总数等于N的所有值的组合(javascript),javascript,node.js,Javascript,Node.js,我在计算一些化学,我需要的值的组合,总和等于N个数。我有以下数组,每个数组的值不能超过X 数组: 索引|最大值 0 | 370 1 | 185 2| 740 3 | 277.5 4 | 277.5 5 | 1850 6 | 925 7 | 1850 我需要一个函数,它将计算每个数组索引的所有可能值的组合,其总和等于1850 例如 0 | 77.00 1 | 700.00 2 | 50.00 3 | 300.00 4 | 700.00 5 | 15.00 6 | 7.00 7|1.00 其中总计=

我在计算一些化学,我需要的值的组合,总和等于N个数。我有以下数组,每个数组的值不能超过X

数组:
索引|最大值
0 | 370
1 | 185
2| 740
3 | 277.5
4 | 277.5
5 | 1850
6 | 925
7 | 1850

我需要一个函数,它将计算每个数组索引的所有可能值的组合,其总和等于1850

例如
0 | 77.00
1 | 700.00
2 | 50.00
3 | 300.00
4 | 700.00
5 | 15.00
6 | 7.00
7|1.00
其中总计=1850

提前感谢您的帮助

这里有一种方法

  • 按升序对数组进行排序(为了使分布更公平—因为我们将按顺序从第一个循环到最后一个循环,并选择数字,大的数字可能会掩盖小的数字,以便有机会)
  • 为结果准备新数组(用0初始化)
  • 对于排序数组中的每个条目,我们将取一些随机值,直到(达到总和)-在本例中,我们减少一些计数器变量来跟踪(
    pointsLeft
    )。将随机选取的数字添加到指定索引处的结果数组(结果数组索引应遵循原始数组的顺序,而不是排序的顺序)
  • 如果没有
    点left
    ,则表示结果数组中的项等于所需的和。所以我们只返回结果数组
const testArray=[
370,
185,
740,
277.5,
277.5,
1850,
925,
1850,
]
函数getRandomInt(最小值、最大值){
min=数学单元(min);
最大值=数学楼层(最大值);
返回Math.floor(Math.random()*(max-min+1))+min;
}
函数getCombination(值,pointsLeft){
让排序=值.map((x,i)=>{
返回[x,i]
}).sort((a,b)=>a[0]-b[0]);//从小到大排序-保留原始索引
常量结果=新数组(值.length).fill(0)
而(pointsLeft>0){
for(排序的.entries()的常量[_,[value,原始索引]]{
someRandomValueToSubtract=getRandomInt(1,值/2)
如果(pointsLeft-someRandomValueToSubtract<0)继续
pointsLeft-=someRandomValueToSubtract
结果[原始索引]+=someRandomValueToSubtract
}
}
返回结果
}
常数x=getCombination(testArray,1850)
console.log(“项:”,x)
console.log(“总和:”,x.reduce(函数(a,b)){
返回a+b;
},0))

作为控制台包装{max height:100%!important;top:0;}
这是否回答了您的问题@aRvi上面的问题是一个将被传递的静态数组,我想要任何不超过最大值的值组合“…不能超过X…”-但可以是零或负?@tibebs。M它应该是正的,没有零或负@Tibebebes。M很好的解决方案,不是假设一些随机数,我们能得到所有和为1850的组合吗?@NitinMuchhadiya哦,我认为用这样的最大值计算所有的组合将是一项高度内存密集型任务(如果考虑浮点数,这是不可能的——无限可能的)。但是,如果我找到一个优化的解决方案,我会更新答案。@NitinMuchhadiya,请注意,如果我们要检查所有对我有效的组合(假设只有整数值和输入数组),可能会有
1.2304101e+22
检查量,希望使用此功能不会出现内存问题我的意思是几乎不可能检索所有内容:)