này trông giống như một Dynamic Programming vấn đề cổ điển (còn thể hiện bằng câu trả lời khác đề cập tương đồng so với 0-1 vấn đề Knapsack và tập hợp con Sum).Toàn bộ điều này chỉ là một lựa chọn đơn giản: đối với mỗi phần tử trong danh sách, chúng ta có sử dụng nó trong tổng của chúng ta hay không. Chúng tôi có thể viết lên một hàm đệ quy đơn giản để tính toán câu trả lời:
f(index,target_sum)=
0 if target_sum<=0 (i.e. we don't need to add anymore)
infinity if target_sum>0 and index is past the length of n (i.e. we have run out of numbers to add)
min(f(index+1,target_sum), f(index+1,target_sum-n[index])+n[index]) otherwise (i.e. we explore two choices - 1. take the current number 2. skip over the current number and take their minimum)
Kể từ khi chức năng này có bài toán chồng chéo (nó khám phá những bài toán tương tự hơn và hơn nữa), nó là một ý tưởng tốt để memoize chức năng với bộ nhớ cache để giữ các giá trị đã được tính trước đó.
Dưới đây là mã trong Python:
#! /usr/bin/env python
INF=10**9 # a large enough number of your choice
def min_sum(numbers,index,M, cache):
if M<=0: # we have reached or gone past our target, no need to add any more
return 0
elif len(numbers)==index: # we have run out of numbers, solution not possible
return INF
elif (index,M) in cache: # have been here before, just return the value we found earlier
return cache[(index,M)]
else:
answer=min(
min_sum(numbers,index+1,M,cache), # skip over this value
min_sum(numbers,index+1,M-numbers[index],cache)+numbers[index] # use this value
)
cache[(index,M)]=answer # store the answer so we can reuse it if needed
return answer
if __name__=='__main__':
data=[10,6,3,100]
M=11
print min_sum(data,0,M,{})
Giải pháp này chỉ trả về tổng mức tối thiểu, không phải là yếu tố thực tế sử dụng để thực hiện nó. Bạn có thể dễ dàng mở rộng ý tưởng để thêm ý tưởng đó vào giải pháp của mình.
Ví dụ tốt nhất tôi có thể nghĩ là Với phiếu mua hàng trị giá M, tôi đi đến cửa hàng và chọn sản phẩm sao cho tôi sử dụng đầy đủ phiếu thưởng và thanh toán tối thiểu tiền mặt để nạp tiền. Tôi cũng sẽ chọn kết hợp với số lượng sản phẩm ít nhất nếu có nhiều hơn 1 kết hợp tạo ra cùng một giá trị tổng. –
Số lượng sản phẩm ít nhất để chọn sẽ là tổng {n [?] + N [c] + ...} khi tổng hợp> M. Tôi có sai không? – Chris
tổng của nó> = M, ưu tiên chuyển đến tập hợp có sự khác biệt giữa tổng và M là nhỏ nhất. nếu hai bộ có cùng số tiền, tập hợp có số 'sản phẩm' ít nhất sẽ thắng –