Giả sử chúng ta có một tập hợp các số ứng viên (tất cả các phần tử duy nhất) và một số mục tiêu. Chúng ta phải tìm tất cả các tổ hợp duy nhất trong ứng viên sao cho tổng các số ứng viên bằng mục tiêu cho trước. Cùng một số có thể được chọn từ ứng viên vô số lần. Ví dụ, nếu các phần tử là [2,3,6,7] và giá trị mục tiêu là 7, thì đầu ra có thể là [[7], [2,2,3]].
Các bước thực hiện
- Chúng ta sẽ giải quyết bằng phương pháp đệ quy. Hàm đệ quy tên là
solve(). Nó nhận một mảng lưu kết quả, một bản đồ để ghi nhận, giá trị mục tiêu và danh sách các phần tử riêng biệt. Ban đầu mảng kết quả và bản đồ rỗng. Hàmsolvehoạt động như sau: - Nếu mục tiêu bằng 0:
temp:= danh sách các phần tử hiện có trong danh sách hiện tại.temp1:=temp, sau đó sắp xếptemp.- Nếu
tempkhông có trong bản đồ, chèntempvào bản đồ với giá trị 1, chèntemp1vào kết quả. - Trả về.
- Nếu mục tiêu < 0, trả về.
- Với
xtừiđến độ dài danh sách phần tử:- Chèn
elements[x]vào danh sách hiện tại. - Gọi đệ quy
solve(elements, target - elements[x], res, map, i, current). - Xóa phần tử khỏi danh sách hiện tại từ chỉ số (độ dài current - 1).
- Chèn
Ví dụ minh họa
class Solution(object):
def combinationSum(self, candidates, target):
result = []
unique = {}
candidates = list(set(candidates))
self.solve(candidates, target, result, unique)
return result
def solve(self, candidates, target, result, unique, i=0, current=[]):
if target == 0:
temp = [i for i in current]
temp1 = temp
temp.sort()
temp = tuple(temp)
if temp not in unique:
unique[temp] = 1
result.append(temp1)
return
if target < 0:
return
for x in range(i, len(candidates)):
current.append(candidates[x])
self.solve(candidates, target - candidates[x], result, unique, i, current)
current.pop(len(current)-1)
ob1 = Solution()
print(ob1.combinationSum([2,3,6,7,8], 10))
Đầu vào
[2,3,6,7,8] 10
Đầu ra
[[2, 8], [2, 2, 2, 2, 2], [2, 2, 3, 3], [2, 2, 6], [3, 7]]