错误的结果在一个项目euler 31

Wrong result in a project euler 31

本文关键字:一个 项目 euler 结果 错误      更新时间:2023-10-16

我试图解决项目euler 31:

在英格兰,货币由英镑、英镑和便士组成流通中有八种硬币:

1便士、2便士、5便士、10便士、20便士、50便士、1英镑(100便士)和2英镑(200便士)。有可能通过以下方式赚2英镑:

1×£1+1×50p+2×20p+1×5p+1×2p+3×1p

2英镑可以有多少种不同的方式用任何数量的硬币制作?

使用此代码:

#define to2(x) ((x)/2+1)
int to5(x)
{
    int acc=1;
    for(;x>0;x-=5)
        acc+=to2(x);
    return acc;
}
int to10(x)
{
    int acc=1;
    for(;x>0;x-=10)
        acc+=to5(x);
    return acc;
}
int to20(x)
{
    int acc=1;
    for(;x>0;x-=20)
        acc+=to10(x);
    return acc;
}
int to50(x)
{
    int acc=1;
    for(;x>0;x-=50)
        acc+=to20(x);
    return acc;
}
int to100(x)
{
    int acc=1;
    for(;x>0;x-=100)
        acc+=to50(x);
    return acc;
}
int main()
{
    int test = to100(200)+1;
    printf("%d",test);
    return 0;
}

但代码给出的是73685,而不是73682,但我不知道为什么,有人能帮我吗?

为什么要将acc初始化为1?(当x是函数数的倍数时,这是有意义的,但仅限于此。)将其更改为0,并将循环条件更改为x>=0。(如果我理解你的代码)。

这个问题不需要C代码来解决,它是一个集合选择的问题。你需要求解number of ways to select n coins where n > 0 and sum = 2£,你应该查阅集合论
这应该可以帮助你找到一个线性方程来计算这个数字。

相关文章: