将数字表示为子集S中的K个数之和的方式的数量

时间:2016-05-13 07:20:43

标签: algorithm counting

设S为{1,2,4,5,10}

现在我想找到表示x作为集合S的K个数之和的方法的数量(一个数字可以包含任意次数)

如果x = 10且k = 3

然后ans应为2 => (5,4,1),(4,4,2) 数字的顺序并不重要,即(4,4,2)和(4,2,4)算作一个。

我做了一些研究,发现该集合可以表示为多项式x ^ 1 + x ^ 2 + x ^ 4 + x ^ 5 + x ^ 10,并且在将多项式提升到幂K之后,系数为乘积多项式给出了ans。

但是ans包括(4,4,2)和(4,2,4)作为我不想要的独特术语

有没有办法让(4,4,2)和(4,2,4)算作同一个词?

1 个答案:

答案 0 :(得分:0)

这是NP-complete,是here所描述的和子集问题的变体。

坦率地说,我不认为你可以通过非指数(迭代但所有组合)解决方案解决它,对问题输入没有任何限制(例如最大数字范围等)。

对问题域没有任何限制,我建议迭代所有可能的k-set实例(如伪多项式时间动态编程解决方案中所述)并查看哪些是解决方案。< / p>

检查2个解决方案是否完全相同,这与整个算法的复杂性无关。因此,解决方案集元素的哈希将正常工作:

E.g。 hash-order-insensitive(4,4,2)==hash-order-insensitive(4,2,4) =&gt;检查整个集合,否则解决方案是不同的。

PS:您还可以逐步描述当前的解决方案。