题目描述
Z国的货币系统包含面值1元、4元、16元、64元共计4种硬币,以及面值1024元的纸币。现在小Y使用1024元的纸币购买了一件价值为N (0 < N \le 1024)N(0<N≤1024)的商品,请问最少他会收到多少硬币?
输入描述:
一行,包含一个数N。
输出描述:
一行,包含一个数,表示最少收到的硬币数。
示例1
输入
200
输出
17
说明
花200,需要找零824块,找12个64元硬币,3个16元硬币,2个4元硬币即可。
备注:
对于100%的数据,N (0 < N \le 1024)N(0<N≤1024)。
本地IDE代码
# 本地代码,验证通过的
def minCoins(N):
if N == 1024:
return 0
tmp = 1024 - N
dp = [tmp] * (tmp + 1)
dp[0], dp[1] = 0, 1
for i in range(2, tmp + 1):
for coin in [1, 4, 16, 64]:
if tmp < coin:
continue
dp[i] = min(dp[i], dp[i - coin] + 1)
return dp[1024 - N]
if __name__ == "__main__":
print(minCoins(123))
牛客网提交
N = int(input())
if N == 1024:
print(0)
tmp = 1024 - N
dp = [1024] * (tmp + 1)
dp[0], dp[1] = 0, 1
for i in range(2, tmp + 1):
for coin in [1, 4, 16, 64]:
if tmp < coin:
continue
dp[i] = min(dp[i], dp[i - coin] + 1)
print(dp[tmp])
牛客网提交后,死活不通过,显示结果非零
查询得知,结果非零的意思的代码退出的时候不是以正常的0退出的,而是非0状态,也就是代码出错了
百思不得其解,到底为什么,除了一个return换成了print,其他没变
解决
将提交的牛客网代码塞入本地shell,查看运行结果,原来是print惹的祸
平常写函数的时候,遇到特定条件,直接return返回,那return后面的代码将不会被执行
但是换成print的时候,后面的代码还是会执行,一旦N=1024的时候,数组就越界了,自然而然报错
也就是说,我们要造成类似return的效果
因为是在shell中执行的,所以改成以下代码即可
N = int(input())
if N == 1024:
print(0)
exit(0)
tmp = 1024 - N
dp = [1024] * (tmp + 1)
dp[0], dp[1] = 0, 1
for i in range(2, tmp + 1):
for coin in [1, 4, 16, 64]:
if tmp < coin:
continue
dp[i] = min(dp[i], dp[i - coin] + 1)
print(dp[tmp])