Tôi đã xem qua vấn đề này:Số cách để thực hiện thay đổi đối với số tiền N
http://www.geeksforgeeks.org/dynamic-programming-set-7-coin-change/
Cho một giá trị N, nếu chúng ta muốn thực hiện thay đổi cho N cent, và chúng tôi có cung cấp vô hạn của mỗi đồng tiền có giá trị S = {S1, S2, .., Sm}, chúng ta có thể thay đổi bao nhiêu cách? Thứ tự của tiền xu không quan trọng. Ví dụ: đối với N = 4 và S = {1,2,3}, có bốn giải pháp: {1,1,1,1}, {1,1,2}, {2,2} , {1,3}. Vì vậy, đầu ra phải là 4. Đối với N = 10 và S = {2, 5, 3, 6}, có năm giải pháp: {2,2,2,2,2}, {2,2,3,3}, {2,2,6}, {2,3,5} và {5,5}. Vì vậy, sản lượng nên được 5.
tôi đã đưa ra các giải pháp:
// recurrence relation
count[N] = count[N-d] for all denomination <= N
Source code
-----------
public static int numWays(int N, int[] denoms) {
if (N == 0)
return 0;
int[] ways = new int[N+1];
ways[0] = 1;
for (int i=1; i<=N; i++) {
ways[i] = 0;
for (int d : denoms) {
if (d <= i) {
ways[i] += ways[i-d];
}
}
}
return ways[N];
}
Nhưng điều này đếm các bản sao mà có mệnh giá tương tự nhưng theo thứ tự khác nhau. Ví dụ, nếu mệnh giá = {1,2} và N = 3, thì nó tính {1,1,1}, {2,1}, {1,2} có mục trùng lặp {1,2}.
Tôi thấy rằng giải pháp DP được mô tả trong liên kết here tránh trùng lặp. Tôi hiểu làm thế nào các mối quan hệ lặp lại hoạt động và tất cả nhưng tôi không thể hiểu làm thế nào nó có thể tránh các bản sao trong khi giải pháp của tôi là không. Xin giải thích ý tưởng đằng sau.