【发布时间】:2020-12-31 02:29:43
【问题描述】:
我今天做了一个算法练习。这个问题的教程给出了一个用 C++ 编写的示例答案:
int dp[21][200];
int i, j, k;
void main()
{
int bucketN, fishN;
scanf("%d %d", &bucketN, &fishN);
dp[0][0] = 1;
for(int i = 1; i <= bucketN; ++i)
{
for(int j = 0; j <= fishN; ++j)
{
for(int k = 0; k <= 10 && j-k >= 0; ++k)
{
dp[i][j] += dp[i-1][j-k];
}
}
}
printf("%d\n",dp[bucketN][fishN]);
}
如果bucketN 和fishN 都是20,则输出将是65649764。
我将C++实现翻译成Python,我的代码如下所示。
import numpy as np
arr = np.zeros((21, 200))
def main(bucket, fish):
b, f = bucket, fish
arr[0, 0] = 1
for i in range(1, b+1):
for j in range(f+1):
for k in range(11):
if j-k < 0:
break
else:
arr[i, j] += arr[i-1, j-k]
print(arr[b, f])
return arr[b, f]
if __name__ == '__main__':
main(20, 20)
bucket 和 fish 仍然是 20,但输出是 68785126410.0。
我感到很困惑,我认为我的代码和原来的 C++ 代码是一样的。希望有C++或者Python方面的高手给解释一下。
【问题讨论】:
-
您能否打印出整个数组以查看数字开始不一致的位置,或者差异中是否存在明显的模式?
-
Python 代码给出了准确的答案,但 C 代码溢出了数据类型。
-
将 C 代码中的数组声明更改为
long long而不是int,然后是%lld而不是%d以打印正确的值。另外,不知道你为什么认为那是 C++。 -
@ggorlen "Python 代码给出了准确的答案" - 它给出了答案。 “准确”不起作用。
-
@TedLyngmo 你是什么意思?