natknąłem tego problemu:ilość sposobów, aby zmiany na kwotę N
http://www.geeksforgeeks.org/dynamic-programming-set-7-coin-change/
Biorąc pod uwagę wartość N, jeśli chcemy, aby zmiany do N centów, a mamy nieskończoną dostaw każda z monet o wartości S = {S1, S2, .., Sm}, ile sposobów możemy dokonać zmiany? Kolejność monet nie ma znaczenia.
Na przykład dla N = 4 i S = {1,2,3} istnieją cztery rozwiązania: {1,1,1,1}, {1,1,2}, {2,2} , {1,3}. Zatem wynik powinien wynosić 4. Dla N = 10 i S = {2, 5, 3, 6}, istnieje pięć rozwiązań: {2,2,2,2,2}, {2,2,3,3}, {2,2,6}, {2,3,5} i {5,5}. Więc wyjście powinno być 5.
wymyśliłem rozwiązanie:
// 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];
}
Ale liczy duplikaty, które mają te same nominały, ale w innej kolejności. Na przykład, jeśli nominały = {1,2} i N = 3, to liczy {1,1,1}, {2,1}, {1,2}, które mają zduplikowane wejście {1,2}.
Widzę, że rozwiązanie DP opisane w łączu here pozwala uniknąć duplikatów. Rozumiem, jak działa relacja nawrotów, ale nie jestem w stanie zrozumieć, w jaki sposób można uniknąć duplikatów, podczas gdy moje rozwiązanie nie jest możliwe. Proszę wyjaśnij tę ideę.