【问题标题】:Subset Sum Variation - subset has X number of items子集总和变化 - 子集有 X 个项目
【发布时间】:2019-09-28 16:00:13
【问题描述】:

我正在寻找一种算法,它允许我快速访问(不一定打印)300 个项目集的每个 X 项目子集,当子集中项目的值是加起来等于 Y。允许重复,顺序很重要。 300 个项目集的所有值都是正数。

例如,

300 个项目集:[1.5, 1.34, 3, .25, 2.333, 1.75, .125, .675, 2, 4, .75, ....]

X = 5

Y = 6

算法生成:

[2, 2, 1.5, .25, .25]
[2、2、.25、1.5、.25]
[2, 1.5, 2, .25, .25]
[1.5、2、2、.25、.25]
[2, 1.75, .5, .5, 1.25]
[2, 1.75, .5, 1.25, .5]
[2, 1.75, 1.25, .5, .5]
[2, 1.25, .5, .5, 1.75]
[1.25、2、.5、.5、1.75]
[.5, 2, .5, 1.25, 1.75]
[3、1、1、.5、.5]
[1、3、1、.5、.5]
[1、1、3、.5、.5]
[1, 1, .5, 3, .5]
[1, 1, .5, .5, 3]

等等……

[2, 2, 1.5, .25, .25] 是允许的并且

[2, 1.75, .5, .5, 1.25] 与 [1.25, .5, .5, 1.75, 2] 不同。

我意识到这是 Subset Sum 问题的一种变体,但我似乎无法在网上任何地方找到这种变体的任何有用示例。现在我当前的解决方案实现了嵌套循环(嵌套循环的数量由 X 的值决定)当 X 很小时工作正常,但当 X 开始上升时很快变得非常慢。任何意见将不胜感激!

【问题讨论】:

标签: javascript algorithm subset-sum


【解决方案1】:

一种方法是收集子集并检查子集的长度和总和是否合适。

如有必要,您可以排列子集。

function subsetSum(array, sum, items) {

    function iter(taken, index, subsum) {
        if (taken.length === items && subsum === sum) return result.push(taken);
        if (taken.length === items || subsum === sum || index === array.length) return;
        iter([...taken, array[index]], index, subsum + array[index]);
        iter(taken, index + 1, subsum);
    }

    var result = [];

    iter([], 0, 0);
    return result;
}

var result = subsetSum([1.5, 1.34, 3, .25, 2.333, 1.75, .125, .675, 2, 4, .75], 6, 5);

console.log(result.map(a => a.join(' ')));
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 哇。超级有趣。我曾考虑过递归,但可以弄清楚如何实现它。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-12-24
  • 2017-03-28
  • 1970-01-01
  • 2018-02-14
  • 2021-11-14
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多