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)
。是否可以更正此问题?