Python 从给定的数字求和到给定值的序列?

Python 从给定的数字求和到给定值的序列?,python,algorithm,Python,Algorithm,给定一组整数(正数或负数),我如何才能找到这些数字的总和为给定值的序列 示例:给定一个数字列表[4,-16,9,33],我需要求和17。我可以选择序列[4,4,9](数字可以重复使用)或[-16,33]。我试图找到一种有效的方法来缩短序列的长度 这就像子集和问题(),但在我的例子中,数字可以重复使用 这也有点像分区问题(),但在我的例子中有负值 我当前的贪婪算法如下。在每个循环中,我将尝试找到一个使当前和与目标和之间的差异最小化的数字 integers = [-2298478782, 15273

给定一组整数(正数或负数),我如何才能找到这些数字的总和为给定值的序列

示例:给定一个数字列表
[4,-16,9,33]
,我需要求和
17
。我可以选择序列
[4,4,9]
(数字可以重复使用)或
[-16,33]
。我试图找到一种有效的方法来缩短序列的长度

这就像
子集和问题
(),但在我的例子中,数字可以重复使用

这也有点像分区问题(),但在我的例子中有负值

我当前的贪婪算法如下。在每个循环中,我将尝试找到一个使当前和与目标和之间的差异最小化的数字

integers = [-2298478782, 1527301251, 4, 4078748803, 3388759435,
        1583071281, 2214591602, 1528349827, -12, 59460983,
        -939524100, -1, 2315255807]
target_sum = 1997393191

difference = target_sum
chain = list()
while difference != 0:
    min_abs_difference = abs(difference)
    next_int = 0
    found = False
    for i in integers:
        new_abs_diff = abs(i+difference)
        if new_abs_diff < min_abs_difference:
            found = True
            next_int = i
            min_abs_difference = new_abs_diff
    if not found:
        print(difference)
        print(chain)
        print("Cannot find an integer that makes difference smaller")
        break
    difference += next_int
    chain.append(next_int)
print(chain)
integers=[-2298478821527301251,440787488033388759435,
1583071281, 2214591602, 1528349827, -12, 59460983,
-939524100, -1, 2315255807]
目标_sum=1997393191
差=目标和
链=列表()
而差异!=0:
最小abs差值=abs(差值)
next_int=0
发现=错误
对于整数形式的i:
新的_abs_diff=abs(i+差值)
如果新的制动差异<最小制动差异:
找到=真
next_int=i
最小制动差异=新制动差异
如果未找到:
打印(差异)
打印(链)
打印(“找不到使差异变小的整数”)
打破
差+=下一个整数
chain.append(next_int)
打印(链)

最有可能的是,没有一种快速算法可以给出最佳解决方案。子集和问题是NP完全问题,这个问题比你的问题简单(因为你允许重复使用数字)


考虑到这个问题是NP完全问题,我认为您应该专注于改进当前的算法,或者用更快的语言(如C)重写它。然后您可以从Python调用您的C代码。

因为它显然至少是NP完全问题,您可以考虑将其表述为一个混合整数线性规划问题

Minimize summation( Xi ) // Xi = number of times the array element Ai is used.
Subject To
     summation( Ai*Xi ) = S.
     Xi >= 0 { Xi are all integers }

您可以使用任何解算器进行求解。

似乎您已经找到了解决方案。你是想达到某种复杂度还是减少需求或其他什么?@WaleedKhan这是一个贪婪的算法,所以它可能不会给出最优的解决方案。我希望有人能给我一个更好的解决方案,它可能更快(我的很慢)或者给出一个最优的解决方案。我不认为目前的算法考虑了所有的可能性。你需要强迫它。。。哎呀,没有甜的算法this@AbhishekBansal不,没有。这只是一个贪婪的算法,根据当前情况做出选择。谢谢你的回答。我不熟悉混合整数线性规划,除了
Integer\u Programming
的wiki页面。你介意给一些适合新手的页面吗?不清楚如何证明NP硬度。看见你有关于这个问题的草图或参考文献吗?谢谢你的建议。我将尝试
Cython
来提高性能。