我翻译的内容如下:
我浏览了这个问题:
求和为S且元素个数为N的所有方式 找到从给定集合中允许重复的数字中得出给定数字总和的所有方式
我没有很明白那里的回答,
我编写了两种解决问题的方法:
找到一些可以使用数字N(允许重复)达到总和S的方法数量
例如:总和=4和数字=1、2、3,答案是1111、22、1122、31、13、1212、2112、2212
我在其中一个方法中使用了记忆化,而在另一个方法中则没有。不知怎么地,在我的机器上,记忆化版本运行得比非记忆化版本慢得多。
这两种解决方案都有效。
记忆化版本:
def find_denomination_combinations(amount, denominations):
memo = {}
def calculate_combinations(max_amt):
return_list = list()
for denomination in denominations:
new_sum = max_amt - denomination
if new_sum == 0:
return_list.append([max_amt])
return return_list
elif new_sum < 0:
return [[]]
else:
if new_sum in memo:
combi_list = memo[new_sum]
else:
combi_list = calculate_combinations(new_sum)
for combination in combi_list:
if new_sum in memo and combination[:] not in memo[new_sum]:
memo[new_sum].append(combination[:])
else:
memo[new_sum] = []
memo[new_sum].append(combination[:])
combination.append(denomination)
return_list.append(combination)
return return_list
result = calculate_combinations(amount)
return result
非记忆化版本
def find_denomination_combinations_nmemo(amount, denominations):
def calculate_combinations(max_amt):
return_list = list()
for denomination in denominations:
new_sum = max_amt - denomination
if new_sum == 0:
return_list.append([max_amt])
return return_list
elif new_sum < 0:
return [[]]
else:
combi_list = calculate_combinations(new_sum)
for combination in combi_list:
combination.append(denomination)
return_list.append(combination)
return return_list
result = calculate_combinations(amount)
return result
我的算法是:
对于给定的整数集合中的每个D,计算[T(sum-D)]
如果输入的sum=16,整数集合为[1,2,3]
非记忆化版本运行时间为0.3秒,记忆化版本需要5秒