嘗試使用DP解決此經典問題時遇到了實現問題。 問題給出了一組硬幣,並返回進行更改的方式數量。更改硬幣執行問題
的DP方程是類似如下: DP [I] + = DP [I - 硬幣[J]]
其中DP [I]表示的找零對於i的方式的數量。
下面是一個簡單的實現方式中,這是不正確:
int make_change_wrong(int coin[], int size, int change) {
vector<int> DP(change + 1, 0);
DP[0] = 1;
for (int i = 1; i <= change; ++i) {
for (int j = 0; j < size; ++j) {
if (i - coin[j] >= 0) {
DP[i] += DP[i - coin[j]];
}
}
}
return DP[change];
}
給定的輸入: INT硬幣[] = {1,5} 變化= 6
make_change_wrong(硬幣,2, 6)返回3,但2是正確的。
使用相同的邏輯,我在這一個不太直觀的方式重新編寫,並得到正確的答案:
int make_change(int coin[], int size, int change) {
vector<int> DP(change + 1, 0);
DP[0] = 1;
for (int i = 0; i < size; ++i) {
for (int j = coin[i]; j <= change; ++j) {
DP[j] += DP[j - coin[i]];
}
}
return DP[change];
}
這困擾了我很多,因爲對我來說,他們是同樣的事情... 有人可以說明兩個實現中的問題嗎?
如果你在兩個實現之間得到不同的答案,那麼顯然它們不是等價的。也許你可以插入一些調試語句來打印DP數組的內容,這可能有助於說明它們的不同之處。 –
感謝Brian,我知道第一個函數計數{1,1,1,1,1}兩次,但我不明白爲什麼第二個計數正確 - 他們似乎只用兩種不同的方式編碼。 – galactica