coin chenge 动态规划

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 就这样吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值