我试图解决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示例。