硬币兑换问题 蓝桥杯省赛python 递归和动态规划求解

本文介绍了使用递归和动态规划两种方法解决兑换问题,即用1,2,5面值的纸币凑出7元,找到所需的最少张数。作者提供了Python代码实现并展示了计算过程。
摘要由CSDN通过智能技术生成

题目

面值1,2,5

兑换7元

最少用多少张纸币

代码

1.递归法求解

#1,2,5 兑换7元 用最少几个纸币
s=list(map(int,input().split(",")))
m=int(input())
n=len(s)
count=0
sum=0
jishu=[]
fafang=[]
def find(s,c):
    global sum,count
    if c==0:
        jishu.append(count)
        # print(fafang)
    if c < 0:
        return
    if c>0:
        for i in range(n):
            sum=sum+s[i]
            count=count+1
            # fafang.append(s[i])
            find(s,c-s[i])
            sum=sum-s[i]
            count=count-1
            # fafang.remove(s[i])
find(s,m)
if len(jishu)==0:
    print(-1)
else:
    print(min(jishu))

2.动态规划方法(参考运筹学)

mount=7
dp=[mount+1]*(mount+1)
coins=[1,2,5]
dp[0]=0
for i in range(1,mount+1):
    for coin in coins:
        if  i-coin>=0:
            dp[i]=min(dp[i],1+dp[i-coin])
print(dp)

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面我将分别给出递归动态规划的解法,并使用 Python 代码来实现。 01背包问题是一个经典的动态规划问题,其表述如下:有一个背包,容量为C,有n个物品,每个物品有重量w和价值v,现在要把这些物品放入背包中,使得背包中物品的总价值最大,求最大价值。 1. 递归解法 递归解法比较简单,但是由于存在大量的重复计算,效率比较低。具体思路是:对于每个物品,有两种选择,放入背包或不放入背包,然后递归处理剩下的物品。 代码如下: ```python def knapsack01_recursion(C, w, v, n): if n == 0 or C == 0: return 0 if w[n-1] > C: return knapsack01_recursion(C, w, v, n-1) else: return max(v[n-1] + knapsack01_recursion(C-w[n-1], w, v, n-1), knapsack01_recursion(C, w, v, n-1)) ``` 2. 动态规划解法 动态规划解法使用一个二维数组来存储中间状态,具体思路是:定义一个二维数组dp[i][j],表示前i个物品放入容量为j的背包中可以获得的最大价值。对于每个物品,有两种选择,放入背包或不放入背包,状态转移方程为: dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i-1]]+v[i-1]),其中w[i-1]和v[i-1]分别表示第i个物品的重量和价值。 最终的结果为dp[n][C]。 代码如下: ```python def knapsack01_dp(C, w, v, n): dp = [[0 for _ in range(C+1)] for _ in range(n+1)] for i in range(1, n+1): for j in range(1, C+1): if w[i-1] > j: dp[i][j] = dp[i-1][j] else: dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i-1]]+v[i-1]) return dp[n][C] ``` 以上就是使用递归动态规划解决01背包问题Python代码实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值