算法篇1 - 假设你有无限数量的邮票,面值分别为6角,7角,8角,请问你最大的不可支付邮资是多少元?

前言

为什么要学算法,因为算法在面试过程中需要掌握算法,很多公司面试也有算法题,所以我们可以尝试去解题;

今天有一个朋友(手动艾特文彬)问我,这道题该怎么理解,该怎么去得出答案,研究了一波,并开始总结算法篇的博客;

看题目博主感觉这是一道小学的数学题,但是可以使用python来解答。

1、分析步骤

1、我们假设每种邮票一共有N张,面值分别是6、7、8毛;
2、此时总共的邮票就有N张,我们通过各种排列组合来得到每种组合的面值和,可以存放一个列表;
3、然后得到该列表,里面都是可以支付的邮资面值和;
4、对该列表进行去重(为什么要去重?,因为组合出来的面值和肯定有重复的,比如6666四张六毛,888三张八毛,都会是24)
5、再对该列表进行排序,从小到大排;
6、上述列表可以得到可支付邮资的面值数,再做一次循环筛选不在里面的,得到的数值就是不可支付的邮资了;

2、实现

a = 6
b = 7
c = 8
count = 20  # 假设三种面值的张数共有20张
listcount = [] # 该列表存放可以支付邮资的面值和

for x in range(count+1) :
    for y in range(count+1-x) : # 为什么要-x,因为有一张x就要少一张y,同理 有一张y,后面就要少一张z
        for z in range(count+1-x-y):
            num = int(a*x + b*y + c*z)
            listcount.append(num)

set_1 = set(listcount) # 列表转换成集合,去重
listcount = list(set_1) # 再转化为列表
listcount.sort()        # 列表进行排序
print(listcount)        # 打印列表


# 再将不可支付的邮资进行循环,也存放一个列表中
notcount = []
# 下面 c*count 是指最大组合值,比如最大组合值是100,那么从1->100,依次遍历出来,如果该值未在listcount中,可以认为该值为不可以支付邮资数
for y in range(c*count+1):
    if y not in listcount :
        notcount.append(y)

print(notcount)
print(notcount[-1])  # 打印不可支付邮资数的最大值

3、结果

在这里插入图片描述

所以 最大不可支付的邮资数为17,也就是1.7元啦啦啦!!!


有收获记得给博主点个赞!!谢谢大家

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值