【贪心算法~python】_python用贪心算法思想解决问题并给出程序的注释和分析 有一个长度为n的正整数,从

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

python江湖之进阶

贪心算法

找零问题:

# -\*- coding = utf-8 -\*-
# @Time : 2022/5/12 20:56
# @Author : lxw\_pro
# @File : 算法进阶-01.py
# @Software : PyCharm

'''
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。
也就是说,不从整体最优上加以考虑,它所做出的是在某种意义上的局部最优解。

贪心算法并不保证会得到最优解,但是在某些问题上贪心算法的解就是最优解。
要会判断一个问题能否用贪心算法来计算。
'''
# 找零问题:
t = [100, 50, 20, 10, 5, 1]

def change(t, n):
    a = [0 for _ in range(len(t))]
    for i, money in enumerate(t):
        a[i] = n // money
        n = n % money
    return a, n


print(change(t, 376))       # 运行结果:([3, 1, 1, 0, 1, 1], 0)


[^1**]记录代码,记录学习,成长路上的一大益处,可喜可喜矣!**


分数背包实现:

# 分数背包实现:
goods = [(60, 10), (100, 20), (120, 30)]        # 每个商品元组表示,即(价格,重量)



![img](https://img-blog.csdnimg.cn/img_convert/f193452091bc23080242b3e75a01eaed.png)
![img](https://img-blog.csdnimg.cn/img_convert/c0826b561e239eee9918dd6f09447531.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我理解了你的问题!这是一个典型的贪心算法问题,我们可以采用贪心策略:从左到右扫描这个正整数,每次尽可能地删除当前位置后面的数,直到删除k个数为止。这样可以保证剩下的数的顺序不变,并且使得最终的正整数最小。 下面是Python代码实现,代码中的注释会帮助你理解每个步骤的含义和作用: ```python def delete_numbers(num, k): """ 从长度为n的正整数num中删除k个数,使得剩余的数保持原来的次序不变,返回最小的正整数 """ stack = [] # 创建一个空栈,用于存储删除的数 for digit in num: while k > 0 and stack and stack[-1] > digit: # 如果还需要删除数,并且栈不为空,并且栈顶元素大于当前数,就弹出栈顶元素 stack.pop() k -= 1 stack.append(digit) # 把当前数添加到栈中 # 如果仍然需要删除数,就从栈顶开始删除 while k > 0: stack.pop() k -= 1 # 把剩余的数连接起来,得到最小的正整数 result = ''.join(stack) # 如果结果为空,说明所有数都被删除了,就返回0 return int(result) if result else 0 ``` 这个算法的时间复杂度为O(n),空间复杂度为O(n),其中n为正整数的位数。这个算法的正确性可以通过反证法证明:假设在某一步删除了一个数,但是最终得到的正整数不是最小的,那么就可以通过交换这个数和后面的一个数,得到一个更小的正整数,与原命题矛盾。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值