前言
为什么要学算法,因为算法在面试过程中需要掌握算法,很多公司面试也有算法题,所以我们可以尝试去解题;
今天有一个朋友(手动艾特文彬)问我,这道题该怎么理解,该怎么去得出答案,研究了一波,并开始总结算法篇的博客;
看题目博主感觉这是一道小学的数学题,但是可以使用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元啦啦啦!!!
有收获记得给博主点个赞!!谢谢大家