我的以下代码有什么问题

时间:2011-06-20 19:12:07

标签: c++ algorithm

我正在写硬币改变算法。算法取自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;
}

对于输入23492102,答案是正确的,但2001答案不正确。 我无法在这里找到错误。

1 个答案:

答案 0 :(得分:1)

您似乎混淆了C ++数组的基于0的索引与算法中使用的基于1的索引。也就是说,此代码中算法d[1]d[0]。但在一些地方你也使用了基于0的索引。您可能需要仔细检查所有数组索引。