找零钱 状态转移

给出k种不同面值的硬币,每种硬币数量无限,再给出一个n,表示需要找的金额,请问最少需要几枚硬币才能凑出这个金额?如果凑不出来,输出No Answer!。测试开头给出整数 t 表示测试样例数量。

Input:

4
3 11
1 2 5
3 10
1 5 7
3 10
9 3 11
2 10
1 11

Output:

3

2

No Answer!

10

例如:样例1中11由5+5+1拼凑是最小硬币数量的条件。

1.暴力 dp

ans = \left\{\begin{matrix} \\0,(n = 0) \\ INF,(n<0)) \\min(dp(n-coin)+1) \end{matrix}\right. 

for _ in range(int(input())):
    k,n = map(int,input().split())
    arr = list(map(int,input().split()))
    def dp(n):
        if n == 0:return 0
        if n < 0:return -1
        res = float('INF')
        for i in arr:
            sub = dp(n-i)
            if sub == -1:continue
            res = min(res,1+sub)
        return res if res != float('INF') else -1
    get = dp(n)
    if get == -1:print('No Answer!')
    else:print(get)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值