子集总和,包含2675个数字的列表

时间:2016-11-10 14:26:03

标签: algorithm np subset-sum

我正在寻找是否可以有效解决问题的是/否答案。我很确定使用当前的计算技术状态是不可能的。我很高兴知道我错了。所以这里什么都没有。

我有一个2576个数字列表。我试图在列表中找到总计为44576.54的数字组合。数字列表包含从5位数(精确到两位数)到8位数(精确到两位数)的数字。

我非常感谢你的帮助!

3 个答案:

答案 0 :(得分:0)

你错了。经典的动态编程算法将在现代计算硬件上快速解决这个问题。

答案 1 :(得分:0)

这是动态编程算法,已在Emercoin引擎中实现,用于选择最佳UTXO子集。 有关此解决方案,请参阅source codearticle

该算法的一般思路如下:

你有一套"棒"长度不同(长度是你的数字值)。 您需要选择棒的子集,总长度为4457654。

  1. 让你创建标志的LINE,sum + 1的长度,即4457655.LINE [i] = 1,如果值为" i"找到,并且如果为值的子集,则为零,并且#34; i"找不到。最初,整个数组都是零填充的,因为没有找到任何总和。

  2. Mark LINE [0]:= 1;这是意思,$ 0.00的总和可以很容易找到 - 这是空子集。

  3. while(LINE [4457654] == 0):

    • 从set中获得下一根杆。
    • 将此杆应用于阵列的末端。即,在LINE [4457654]处的杆的末端,杆的开始 - 在LINE [4457654 - 杆长度]。
    • 从阵列末端移动杆开始,并且:
    • 如果LINE [棒的开始] == 1,则LINE [棒的末端]:= 1;

答案 2 :(得分:0)

基本上这个问题有两个解决方案:

  1. 动态编程:复杂性总和* n,因此在您的情况下,这将非常大,您的程序将无法完成数天。

  2. 回溯跟踪解决方案:复杂性2 ^ n,这意味着您的程序不会结束多年,这就是为什么它被称为NP-Hard问题

  3. 我一直在研究子集求和问题很长一段时间,我有一个算法,我已经测试了n = 400,它在几秒钟内得到结果。 目前我正在撰写论文以便将其发布。分享您的意见。我会告诉你它是什么子集,这也将帮助我验证我的算法是否存在真正的问题。

    顺便说一句,你能告诉我为什么你需要获得子集总和吗?你的用例是什么?