我正在写硬币改变算法。算法取自http://ace.cs.ohiou.edu/~razvan/courses/cs404/lecture19.pdf
以下是我的代码:
#include <vector>
#include <iostream>
#include <string>
int compute_change(std::vector<int> &d, int n) {
int k = (int)d.size();
std::vector<std::vector<int> > C(k, std::vector<int>(n + 1));
for ( int i = 0; i < k ; i++)
C[i][0] = 0;
for ( int i = 1; i <= n ; i++)
C[0][i] = i;
for ( int i = 1 ; i < k; i++) {
for ( int j = 1 ; j <= n; j++) {
if ( j < d[i] )
C[i][j] = C[i - 1][j];
else
C[i][j] = std::min(C[i - 1][j], 1 + C[i][j - d[i]]);
}
}
std::cout << C[k - 1 ][n - 1] << std::endl;
return C[k - 1][n - 1];
}
int main ( int argc, char **argv) {
int points[] = {2, 3, 17, 23, 42, 98};
std::vector<int> d (points, points + sizeof(points) / sizeof(int));
int solution = compute_change(d,2349 );
solution = compute_change(d,2102 );
solution = compute_change(d,2001 );
solution = compute_change(d,1747 );
return 0;
}
对于输入2349
和2102
,答案是正确的,但2001
答案不正确。
我无法在这里找到错误。
答案 0 :(得分:1)
您似乎混淆了C ++数组的基于0的索引与算法中使用的基于1的索引。也就是说,此代码中算法d[1]
为d[0]
。但在一些地方你也使用了基于0的索引。您可能需要仔细检查所有数组索引。