算法 - python 给定一个正整数a和一个包含任意个正整数的 列表 b,求所有<=a 的加法组合
问题描述
例如,10,[1,2,3]
输出类似:1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 12 + 2 + 2 +2 + 23 + 3 + 3 + 23 + 2 + 2 + 2 + 1
注意:是小于等于,list 内的正整数有可能并不能正好等于 a.
问题解答
回答1:通过itertools.combinations_with_replacement我们写短一点的代码:
def solve2(lst, bound): max_length = bound // min(lst) for n in range(1, max_length+1):for c in itertools.combinations_with_replacement(lst,n): if sum(c) <= bound:print(’+’.join(map(str, c))) solve2([1,2,3], 10)回答2:
假設該問題符合下列假設:
列表內元素可重複使用
只要是能滿足小於等於上限值的組合都可接受, 就算遠小於上限值甚至是零也可以
以下是暴力法:
# code for python3from itertools import combinationsdef solve(lst, upperbound): candidates = [] for n in lst:for count in range(upperbound//n): candidates.append(n) allcomb = set() for l in range(1, len(candidates)+1):for comb in combinations(candidates, l): if not comb in allcomb:allcomb.add(comb)if sum(comb) <= upperbound: print(’+’.join([str(n)for n in comb]))solve([1,2,3], 10)
我回答過的問題: Python-QA