在尝试使用 DP 解决这个经典问题时,我遇到了一个实现问题。问题是给定一组硬币,并返回做出改变的方式的数量。
DP 方程类似于以下内容: DP[i] += DP[i - coin[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 coin[] = {1, 5} change = 6。
make_change_wrong(coin, 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];
}
这让我很困惑,因为对我来说,它们是同一件事......有人可以说明一下这两种实现中的问题吗?