如何解决UVA 11137

时间:2017-11-12 15:32:53

标签: c coin-change

我试图解决uva 11137

  

Cubeland的人们使用立方币。不仅是货币单位   叫做   立方体   而且硬币的形状像立方体和它们的价值   是立方体。所有立方数值高达9261(= 21 3 )的硬币,即面额为1,8,27,:::,最多9261个立方体的硬币,   在Cubeland有售。

     

您的任务是计算支付给定金额的方式数量   使用立方体币的Cubeland。例如,有3种付款方式   21   立方体:二十一个1   立方体   硬币,或一个8   立方体   硬币和十三1   立方体   硬币,或两个8   立方体   硬币和五个1   立方体   硬币。

     

输入   输入由每行包含要支付的整数金额的行组成。你可以假设所有的   金额是正数且小于10000。

     

输出   对于要支付的每个给定金额,输出一行包含表示的单个整数   使用Cubeland提供的硬币支付给定金额的方法数量

但我遇到了一些问题。我的代码是:

#include <stdio.h>
#include <string.h>
#define max_coin 21
#define max_ammount 10000
int coin[max_coin], make;
unsigned long long int dp[max_coin][max_ammount];

unsigned long long int ways(int i, int ammount)
{
    if(ammount <= 0) return 1;
    if(i >= max_coin-1) return 0;
    if(dp[i][ammount] != -1) return dp[i][ammount];

    unsigned long long int return1 = 0, return2 = 0;
    if(ammount - coin[i] >= 0) return1 = ways(i, ammount-coin[i]);
    return2 = ways(i+1, ammount);

    return dp[i][ammount] = return1 + return2;
}

void make_coins()
{
    int i = 0;
    coin[i] = 1;
    for(i++; i < 21; i++) coin[i] = (i+1)*(i+1)*(i+1);
    return ;
}

int main(void)
{
    memset(dp,-1,sizeof(dp));
    make_coins();
    while(scanf("%d",&make) == 1) printf("%llu\n", ways(0, make));

    return 0;
}

它为几乎所有输入提供了正确的输出。但对于9999(最大)的大输入,其输出与样本不匹配。我做错了什么?

9999

  • 接受输出:440022018293

  • 我的输出:1935335135

我的代码可能与许多其他输入有问题,我不知道;虽然我已经尝试了给uva的udebug示例。

0 个答案:

没有答案