1. 程式人生 > 其它 >演算法篇1 - 假設你有無限數量的郵票,面值分別為6角,7角,8角,請問你最大的不可支付郵資是多少元?

演算法篇1 - 假設你有無限數量的郵票,面值分別為6角,7角,8角,請問你最大的不可支付郵資是多少元?

技術標籤:程式設計-python方向演算法python

前言

為什麼要學演算法,因為演算法在面試過程中需要掌握演算法,很多公司面試也有演算法題,所以我們可以嘗試去解題;

今天有一個朋友(手動艾特文彬)問我,這道題該怎麼理解,該怎麼去得出答案,研究了一波,並開始總結演算法篇的部落格;

看題目博主感覺這是一道小學的數學題,但是可以使用python來解答。

1、分析步驟

1、我們假設每種郵票有N張,面值分別是6、7、8毛;
2、此時總共的郵票就有3N張,我們通過各種排列組合來得到每種組合的面值和,可以存放一個列表;
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) :
        for z in range(count+1):
            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元啦啦啦!!!


有收穫記得給博主點個贊!!謝謝大家