【发布时间】:2017-08-16 18:02:09
【问题描述】:
给定一组整数 1,2 和 3,找出它们加起来为 n 的方式数。 (顺序很重要,即说 n 是 5。1+2+1+1 和 2+1+1+1 是两个不同的解决方案)
我的解决方案是将 n 拆分为 1 的列表,因此如果 n = 5,则 A = [1,1,1,1,1]。我将通过添加相邻的数字从每个列表中递归生成更多子列表。所以 A 会再生成 4 个列表:[2,1,1,1], [1,2,1,1], [1,1,2,1],[1,1,1,2],每个这些列表中的一些将生成更多的子列表,直到它到达像 [3,2] 或 [2,3] 这样的终止案例
这是我提出的解决方案(在 Python 中)
ways = []
def check_terminating(A,n):
# check for terminating case
for i in range(len(A)-1):
if A[i] + A[i+1] <= 3:
return False # means still can compute
return True
def count_ways(n,A=[]):
if A in ways:
# check if alr computed if yes then don't compute
return True
if A not in ways: # check for duplicates
ways.append(A) # global ways
if check_terminating(A,n):
return True # end of the tree
for i in range(len(A)-1):
# for each index i,
# combine with the next element and form a new list
total = A[i] + A[i+1]
print(total)
if total <= 3:
# form new list and compute
newA = A[:i] + [total] + A[i+2:]
count_ways(A,newA)
# recursive call
# main
n = 5
A = [1 for _ in range(n)]
count_ways(5,A)
print("No. of ways for n = {} is {}".format(n,len(ways)))
我想知道我是否走在正确的轨道上,如果是,有什么方法可以让这段代码更有效率吗?
请注意,这不是硬币找零的问题。在硬币变化中,发生的顺序并不重要。在我的问题中,1+2+1+1 与 1+1+1+2 不同,但在硬币变化中,两者都是相同的。请不要为此答案发布硬币找零解决方案。
编辑:我的代码正在运行,但我想知道是否有更好的解决方案。感谢您的所有帮助:)
【问题讨论】:
-
您是否通过编译器运行过这个?你有错误吗?如果没有,那么在提出关于 SO 的问题之前先尝试一下。如果你想让别人告诉你你的代码有多好,试试 Code Review。
-
顺便说一句,您要解决的问题称为“分区”。
-
这组数字一定是1、2、3吗?
-
@Prune:我认为这个问题不适合这个门户。这是一个正常的算法问题,值得关注。为什么要关闭它?
-
FWIW,这种组合的正式名称是composition;如果顺序不很重要,那么它就是一个分区。
标签: python algorithm recursion numbers