javascript - 允许重复使用号码的子集和

标签 javascript math subset subset-sum

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

Target = 44
Result = 1x15, 1x29

Target = 307
Result = 2x110, 3x29

我找到了一种动态编程解决方案,当组合不超过每个数字一个时,该解决方案就有效。所以 Target 44 可以工作,但我的 307 示例不起作用(返回 Not Found)。

如何实现倍数或号码重复使用?

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));

最佳答案

尝试这个递归解决方案:

function subset(people, min, max) {
	const pairs = Object.entries(people),
		results = [],
		getSum = multiplications => multiplications.reduce((sum, multiplicator, position) => 
			sum + pairs[position][1] * multiplicator, 0),
		formatResult = result => result.map(multiplications => 
			multiplications.reduce((res, multiplicator, position) => 
			(multiplicator > 0 ? res.push(`${multiplicator}x${pairs[position][1]}`) : 
				res, res), []));
	function findSums(multiplications, position) {
		let s;
		while((s = getSum(multiplications)) <= max) {
			if (s >= min) {
				results.push([...multiplications]);
			}
			if (position < pairs.length - 1) {
				const m = [...multiplications],
					nextPosition = position + 1;
				m[nextPosition]++;
				findSums(m, nextPosition);
			}
			multiplications[position]++;
		}
	}
	findSums(pairs.map(_ => 0), 0);
	return results.length > 0 ? formatResult(results) : "Not found";
}

var p = {
   optionA:15,
   optionB:29,
   optionC:110
};
var qty = 307;
console.log(subset(p, qty, qty));

关于javascript - 允许重复使用号码的子集和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47471697/

相关文章:

javascript - 可调整大小的 jquery 与 map 不工作

JavaScript 通过类名获取元素

javascript - 如何测试一条线是否相对于另一条线顺时针旋转?

java - 这一行交换了两个变量,但它是如何进行的呢?

r - 当子集长度为零时,如何简洁地处理子集?

javascript - 如何正确使用try/catch、promise catch和async函数?

javascript - 使用 GoogleAPI JS 呈现路线

sql - MySQL 范围和平均值

r - 使用 dplyr 选择列

python - 使用应用于列/系列的函数子集 Pandas 数据框