繁体   English   中英

Python 2.7 - 在列表中查找与另一个数字相加的数字组合

[英]Python 2.7 - find combinations of numbers in a list that add to another number

我想要做的是找到一种方法,让我的代码从添加到变量的列表中返回值的所有组合,将每个答案作为列表返回。 例如,

    target_number = 8
    usingnumbers =  [1, 2, 4, 8]
    returns:
    [8]
    [4, 4]
    [4, 2, 2]
    [4, 2, 1, 1]
    [4, 1, 1, 1, 1]
    [2, 2, 1, 1, 1, 1]
    [2, 1, 1, 1, 1, 1, 1]
    [1, 1, 1, 1, 1, 1, 1, 1]

等等。 我希望丢弃重复值,例如 [4, 2, 2], [2, 4, 2], [2, 2, 4] 在技术上都是有效的,但我只希望其中之一被展示。 理想情况下,我希望代码还返回每个数字在每个列表中出现的次数,但我相信我自己可以做到这一点。

不打算为您编写代码,但有一个主要思想:

函数F(n, (k1, k2, .. km)) - 返回一组数字列表:

{(a11, ... a1i), (a21, ... a2i), ... (aj1, ... aji )}

存在循环关系:

F(n, (k1, k2, .., km)) = union(
  (k1) (+) F(n - k1, (k1, k2, ... km)),
  (k2) (+) F(n - k2, (k2, k3, ... km)),
  ...
  (km) (+) F(n - km, (km))
)

操作a (+) b是“将a附加到b的每个项目”。

有许多角落案例中的一些,但这取决于您。

在伪代码中:

  1. 从你的组合数字中减去你列表中的最大数字,跟踪你开始的数字
  2. 循环直到你不能再循环
  3. 移动到第二大等
  4. 再次开始这个循环,但从小于上次循环的数字开始。

没那么难。

这是一个完整的问题解决方案,整个函数是一个变相的大生成器,第一个for循环使用最小的硬币,第二个循环中,最小的硬币被丢弃,下一个大的将作为基础我们的递归函数。 如果当前硬币的总和等于给定的数字,则返回包含硬币的列表,如果总和更大,则丢弃该列表的数字。

def changes(number, coins_available, coins_current):
    if sum(coins_current) == number:
        yield coins_current
    elif sum(coins_current) > number:
        pass
    elif coins_available == []:
        pass
    else:
        for c in changes(number, coins_available[:], coins_current + [coins_available[0]]):
            yield c
        for c in changes(number, coins_available[1:], coins_current):
            yield c

n = 40
coins = [1,2,5,10,20,50,100]

solutions = [sol for sol in changes(n, coins, [])]

for sol in solutions:
    print sol

print 'least coins used solution:', min(solutions, key=len)
print 'number of solutions', len(solutions)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM