蓝桥杯Python->动态规划_跳跃练习->超市购物练习->练习题总结

文章介绍了如何使用动态规划策略解决一个关于游戏路径优化的问题,玩家需从起点到终点,最大化奖励。同时,文章还展示了如何用Python计算购物清单的最低现金需求,考虑了商品的折扣和取款机的限制。动态规划在这里用于避免重复计算,提高效率。
摘要由CSDN通过智能技术生成

🐻作者: 芝士小熊饼干
📖 系列专栏: 数据结构-蓝桥杯-算法⭐ 
 

💪坚持天数:6天🤖 

 跳跃⭐ 

 

小蓝在一个 n 行 m 列的方格图中玩一个游戏。

开始时,小蓝站在方格图的左上角,即第 11 行第 11 列。

小蓝可以在方格图上走动,走动时,如果当前在第 r 行第 c 列,他不能走到行号比 r 小的行,也不能走到列号比 c 小的列。同时,他一步走的直线距离不超过 33。

例如,如果当前小蓝在第 33 行第 55 列,他下一步可以走到第 33 行第 66 列、第 33 行第 77 列、第 33 行第 88 列、第 44 行第 55 列、第 44 行第 66 列、第 44 行第 77 列、第 55 行第 55 列、第 55 行第 66 列、第 66 行第 55 列之一。

小蓝最终要走到第 n 行第 m 列。

在图中,有的位置有奖励,走上去即可获得,有的位置有惩罚,走上去就要接受惩罚。奖励和惩罚最终抽象成一个权值,奖励为正,惩罚为负。

小蓝希望,从第 11 行第 11 列走到第 n 行第 m 列后,总的权值和最大。请问最大是多少?

n,m=map(int,input().split())
map=[list(map(int,input().split())) for i in range (0,n)]
Num = [(0,1),(0,2),(0,3),(1,0),(1,1),(1,2),(2,0),(2,1),(3,0)]
for x in range(n):
    for y in range(m):
        tmp=[]
        for nx,ny in Num:
            lx=x-nx
            ly=y-ny
            if(lx>=0 and ly>=0 and lx<n and ly<m):
                tmp.append(map[lx][ly])
        if len(tmp)!=0:
            map[x][y]+=max(tmp)
                

print(map[n-1][m-1])  

 超市购物⭐ 

小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。

这不,大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。

小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。

现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。

取款机只能提供

100

100 元面额的纸币。小明想尽可能少取些现金,够用就行了。 你的任务是计算出,小明最少需要取多少现金。

以下是让人头疼的购物单,为了保护隐私,物品名称被隐藏了。

****     180.90       88折

****      10.25       65折

****      56.14        9折

****     104.65        9折

****     100.30       88折

****     297.15        半价

****      26.75       65折

****     130.62        半价

****     240.28       58折

****     270.62        8折

****     115.87       88折

****     247.34       95折

****      73.21        9折

****     101.00        半价

****      79.54        半价

****     278.44        7折

****     199.26        半价

****      12.97        9折

****     166.30       78折

****     125.50       58折

****      84.98        9折

****     113.35       68折

****     166.57        半价

****      42.56        9折

****      81.90       95折

****     131.78        8折

****     255.89       78折

****     109.17        9折

****     146.69       68折

****     139.33       65折

****     141.16       78折

****     154.74        8折

****      59.42        8折

****      85.44       68折

****     293.70       88折

****     261.79       65折

****      11.30       88折

****     268.27       58折

****     128.29       88折

****     251.03        8折

****     208.39       75折

****     128.88       75折

****      62.06        9折

****     225.87       75折

****      12.89       75折

****      34.28       75折

****      62.16       58折

****     129.12        半价

****     218.37        半价

****     289.69        8折

data = data.split()#字符串分割成列表 默认情况下以空格作为分隔符
sum=0
for i in range(0,len(data),3):
    price=float(data[i+1])
    discount =data[i+2]
    if len(discount)==2:
        if discount=="半价":
            discount=0.5
        else:
            discount=float(discount[:1])*0.1
    else :
        discount=float(discount[:2])*0.01
    sum+=price*discount
print(math.ceil(sum/100)*100)

总结 ⭐ 

⭐ 

在Python中,动态规划(Dynamic Programming,DP)算法是一种常见的算法策略,它通常被用于解决那些包含有重复子问题,并且无法使用简单的递归方式解决的问题。

动态规划算法通过将问题拆分成子问题,并且将子问题的解保存到一个表格中以避免重复计算。这样一来,当需要对父问题进行求解时,我们可以通过查询已计算过的子问题解来进行计算,从而实现高效的计算。因此,动态规划算法通常可以显著地提高代码的效率。

在Python中,动态规划算法通常可以使用递归、记忆化搜索或者迭代等不同的方式来实现。

⭐ 

import math

下面是一些常见的math库函数的介绍:

math.ceil(x): 返回不小于x的最小整数。

math.floor(x): 返回不大于x的最大整数。

math.sqrt(x): 返回x的平方根。

math.exp(x): 返回e的x次幂。

math.log(x, base): 返回x的以base为底的对数。

math.sin(x): 返回x的正弦值。

math.cos(x): 返回x的余弦值。

math.tan(x): 返回x的正切值。

math.pi: 圆周率常量

⭐ 

1MB=1024KB 1KB=1024字节 1字节=8位

⭐ 

进制转换总结:

Python 内置函数 bin()oct()hex() 可以分别将十进制数字转换为二进制、八进制、十六进制形式的字符串。

  • bin() 函数可以将一个十进制数字转换为二进制形式的字符串,字符串的前缀为 '0b'
>>> bin(10)
'0b1010'

  • oct() 函数可以将一个十进制数字转换为八进制形式的字符串,字符串的前缀为 '0o'
>>> oct(10)
'0o12'

  • hex() 函数可以将一个十进制数字转换为十六进制形式的字符串,字符串的前缀为 '0x'
>>> hex(10)
'0xa'

另外,可以使用内置函数 int() 将一个字符串转换为十进制数字。

>>> int('1010', 2)  # 将二进制数 '1010' 转换成十进制
10

>>> int('12', 8)  # 将八进制数 '12' 转换成十进制
10

>>> int('a', 16)  # 将十六进制数 'a' 转换成十进制
10

在以上的 int() 函数中,第二个参数指定了要转换的整数的基数(进制),例如 2 表示二进制,8 表示八进制,16 表示十六进制等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芝士小熊饼干

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值