我试图理解以下程序,以从给定列表中找到形成给定总和的子集的数量。
def count_sets(arr, total):
return rec(arr, total, len(arr)-1)
def rec(arr, total, i):
print(arr, total, i)
if total == 0:
return 1
if i < 0:
return 0
if arr[i] > total:
return rec(arr, total, i-1)
else:
return rec(arr, total-arr[i], i-1) + rec(arr, total, i-1)
arr = [2,10,6,4]
print(count_sets(arr, 16))
该程序正常工作,但是我无法找到它的工作方式。
答案 0 :(得分:1)
这是一种backtracking算法。在recursion rec(arr, total, i)
中,它选择rest数组中的最后一个元素arr[i]
,这是两种主要情况:
arr[i]
:rec(arr, total-arr[i], i-1)
arr[i]
:rec(arr, total, i-1)
,当然,当arr[i] > total
时,您只能使用它。并且我们必须具有recursion
的终止条件,即:
if total == 0: return 1
if i < 0: return 0
希望我会说清楚,如果您还有其他问题,请发表评论。 :)