Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 允许重复使用数字的子集和_Javascript_Math_Subset_Subset Sum - Fatal编程技术网

Javascript 允许重复使用数字的子集和

Javascript 允许重复使用数字的子集和,javascript,math,subset,subset-sum,Javascript,Math,Subset,Subset Sum,我有一个正整数列表,例如15、29、110,还有一个目标,例如44。我试图找到所有可能的组合,这些组合的总和达到目标,但重要的是,集合中的数字可以多次使用,例如 Target = 44 Result = 1x15, 1x29 Target = 307 Result = 2x110, 3x29 我发现了一个动态规划解决方案,当组合不超过每个数字中的一个时,该解决方案有效。因此,目标44起作用,但我的307示例不起作用(返回未找到) 如何重复使用倍数或数字 function subset(peo

我有一个正整数列表,例如
15、29、110
,还有一个目标,例如
44
。我试图找到所有可能的组合,这些组合的总和达到目标,但重要的是,集合中的数字可以多次使用,例如

Target = 44
Result = 1x15, 1x29

Target = 307
Result = 2x110, 3x29
我发现了一个动态规划解决方案,当组合不超过每个数字中的一个时,该解决方案有效。因此,目标44起作用,但我的307示例不起作用(返回未找到)

如何重复使用倍数或数字

function subset(people, min, max)
{
  var subsets = [];
  subsets[0] = '';

  for (var person in people)
  {
    for (var s = min-1; s >= 0; --s)
    {
      if (s in subsets)
      {
        var sum = s + people[person];

        if (!(sum in subsets))
        {
          subsets[sum] = subsets[s] + ' ' + person;

          if (sum >= min && sum <= max)
          {
            return subsets[sum];
          }
        }
      }
    }
  }

  return 'Not found';
}

var p = {
   optionA:15,
   optionB:29,
   optionC:110
};
var qty = 307;
console.log(subset(p, qty, qty));
功能子集(人员、最小值、最大值)
{
var子集=[];
子集[0]='';
for(人中人)
{
对于(var s=min-1;s>=0;--s)
{
如果(在子集中)
{
var sum=s+人[人];
如果(!(以子集求和))
{
子集[总和]=子集+人;

如果(sum>=min&&sum尝试此递归解决方案:

功能子集(人员、最小值、最大值){
const pairs=Object.entries(人),
结果=[],
getSum=multiplications=>multiplications.reduce((和,乘法器,位置)=>
和+对[位置][1]*乘法器,0),
formatResult=result=>result.map(乘法=>
乘法。减少((分辨率、乘法器、位置)=>
(乘法器>0?res.push(`${multiplicator}x${pairs[position][1]}`):
(res,res),(res),;
函数findSums(乘法、位置){
让我们;
而((s=getSum(乘法))=min){
结果:推送([…乘法]);
}
如果(位置0),0);
返回results.length>0?formatResult(结果):“未找到”;
}
var p={
选择A:15,
选择B:29,
选项C:110
};
var数量=307;

console.log(子集(p,qty,qty));
尝试此递归解决方案:

功能子集(人员、最小值、最大值){
const pairs=Object.entries(人),
结果=[],
getSum=multiplications=>multiplications.reduce((和,乘法器,位置)=>
和+对[位置][1]*乘法器,0),
formatResult=result=>result.map(乘法=>
乘法。减少((分辨率、乘法器、位置)=>
(乘法器>0?res.push(`${multiplicator}x${pairs[position][1]}`):
(res,res),(res),;
函数findSums(乘法、位置){
让我们;
而((s=getSum(乘法))=min){
结果:推送([…乘法]);
}
如果(位置0),0);
返回results.length>0?formatResult(结果):“未找到”;
}
var p={
选择A:15,
选择B:29,
选项C:110
};
var数量=307;

console.log(子集(p,qty,qty));
以以下方式更改第二个循环:

for (var s = 0; s <= wantedSum - people[person] ; s++)

for(var s=0;s以以下方式更改第二个循环:

for (var s = 0; s <= wantedSum - people[person] ; s++)

for(var s=0;s谢谢你,这适用于我尝试过的大多数测试,但在下面的示例中它错过了一个解决方案:target是650,options是50225550。它找不到1x550,2x50的解决方案。
subset({optionA:50,optionB:225,optionC:550},650650)
。是否可以更正此问题?谢谢,这适用于我尝试过的大多数测试,但在以下示例中,它忽略了一个解决方案:目标是650,选项是50,225,550。它找不到1x550,2x50的解决方案。
子集({optionA:50,optionB:225,optionC:550},650,650)
。是否可以更正此问题?