![](/img/trans.png)
[英]Find all combinations that add up to given number python with list of lists
[英]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
的每个项目”。
有许多角落案例中的一些,但这取决于您。
在伪代码中:
没那么难。
这是一个完整的问题解决方案,整个函数是一个变相的大生成器,第一个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.