import sys
def coinChange( coins, amount):
dp = [0] #dp表示的是组成当前面值需要最少的基础面值币数
length = len(coins)
for i in range(1, amount + 1):
dp += [9999] #相当于list 的append()方法,加入9999这个元素
for j in range(length):
if i >= coins[j] and dp[int(i - coins[j])] != 9999:
dp[i] = min(dp[i], dp[i - coins[j]] + 1)
if dp[amount] == 9999:
return -1
return dp[amount]
if __name__=="__main__":
arr=list(map(int,sys.stdin.readline().strip().split()))
n=int(sys.stdin.readline().strip())
# num=coin_change(arr,n)
num=coinChange(arr,n)
print(num)
写个博记录一下最近在看的算法题,估计写法也只有自己能看的懂了,dp问题的介绍可能以后在写一篇记录一下,这篇就直接上代码了,输入输出风格和牛客一样,毕竟都要在牛客笔试。dp[i]表示积累到i这样一个面值所要的最少的基本面额 [1,2,5]的最少个数,这个第一和爬楼梯一个思路,老用i有点抽象,毕竟小白都不算,举个例子吧,基本 面额【1,2,5】 问要凑够11这个面值最少要多少张,dp[11]可以从dp[10],dp[9],dp[6],这三个状态(这个表述不精确想不出有啥好理解的解释,以后自己应该能看懂吧)加1 就是到dp[11]的最少个数,关于dp【9】dp【10】dp【6】,递归求解,在思考dp【11】时候默认他们已知,边界条件的考虑 dp【0】肯定是0呀,第一层循环初始化到达不同面值所需要的基本面额个数,第二层循环就是去试对于不同面额的三个候选那个能凑出来 dp【i】,if中的第一个条件,就是要的面值要大于基本面额才有意义,第二个条件是说,如果某个面额比i小可以用来凑,同时还要满足,dp【i-coin【j】】是能被基本面额拼出来的,如果都满足那就开始迭代更新,如果有些面值不能被拼成就返回-1,例如只有一种基本面额【2】 你却想要dp【3】,这是不行的,ok 就这样吧。