三、流程控制_3.(3).例:百錢買百雞


百錢買百雞

A雞3元,B雞1元,C雞0.5元,用100元買100只雞,共有多少種買法?

方法一

因為100元剛好買100只B雞,所以不存在只買A雞和B雞,或只買C雞和B雞且有解的情況
當把盡量多的錢買A雞,最多可以買33只A雞余1元,用余下的錢買盡量多的雞(33只A,2只C,共35只)
此時減少A雞,且盡快增加雞的總數,則每少買x只A雞,可以多買6x只C雞(35 - 1x + 6x 只)
當x=13時,買20只A雞,80只C雞,是只買A雞和C雞的唯一解,且是所有情況中A雞購買數量的最大值
(此情況把買A雞以外的錢最大限度填充100只雞的空缺,若再增加A雞,則無法滿足100只雞的條件)
(只買AB不存在,只買BC不存在,只買AC存在唯一解,只剩ABC三種都買)
此時繼續減少A雞,則每少買y只A雞,可以多買3y只B雞(80 + 20 - y + 3y > 100只)
為了保持總數為100只,每溢出1只,就需要把2只C雞換成1只B雞來平衡數量同時保持價格不變

若只買A雞,無解
若只買C雞,無解
若只買B雞,有唯一解

若不買A雞,則只能全買B雞,同上唯一解
若不買C雞,則只能全買B雞,同上唯一解
若不買B雞,則只能買20只A雞,80只C雞,有唯一解

若三種雞都買,以20只A雞,80只C雞為起點,減少A雞,增加B雞,同時用C雞來平衡總量,有多種解

Pa = 3
Pb = 1
Pc = 0.5

A = 20
B = 0
C = 80

N = A + B +C
P = A*Pa + B*Pb + C*Pc
OF = 0
M = 0

while A > 0 :

    A -= 1
    if A == 0 :
        print('方法1:買100只B雞')
        print('方法2:買20只A雞、80只C雞')
        print(f'方法3:若A、B、C雞都買,有{M}種買法')
        print(f'共有{M+2}種買法')
        break

    B += 3
    N = A + B + C

    if N > 100 :
        OF = 2*(N - 100)
        C = C - OF
        B = B + OF/2

    M += 1
    print(f'第{M}種買法:A雞買{A}只,B雞買{B}只,C雞買{C}只')
    print(f'總價:{A}*{Pa} + {B}*{Pb} + {C}*{Pc} = {P}')
    print()

第1種買法:A雞買19只,B雞買5.0只,C雞買76只
總價:19*3 + 5.0*1 + 76*0.5 = 100.0

第2種買法:A雞買18只,B雞買10.0只,C雞買72.0只
總價:18*3 + 10.0*1 + 72.0*0.5 = 100.0

第3種買法:A雞買17只,B雞買15.0只,C雞買68.0只
總價:17*3 + 15.0*1 + 68.0*0.5 = 100.0

第4種買法:A雞買16只,B雞買20.0只,C雞買64.0只
總價:16*3 + 20.0*1 + 64.0*0.5 = 100.0

第5種買法:A雞買15只,B雞買25.0只,C雞買60.0只
總價:15*3 + 25.0*1 + 60.0*0.5 = 100.0

第6種買法:A雞買14只,B雞買30.0只,C雞買56.0只
總價:14*3 + 30.0*1 + 56.0*0.5 = 100.0

第7種買法:A雞買13只,B雞買35.0只,C雞買52.0只
總價:13*3 + 35.0*1 + 52.0*0.5 = 100.0

第8種買法:A雞買12只,B雞買40.0只,C雞買48.0只
總價:12*3 + 40.0*1 + 48.0*0.5 = 100.0

第9種買法:A雞買11只,B雞買45.0只,C雞買44.0只
總價:11*3 + 45.0*1 + 44.0*0.5 = 100.0

第10種買法:A雞買10只,B雞買50.0只,C雞買40.0只
總價:10*3 + 50.0*1 + 40.0*0.5 = 100.0

第11種買法:A雞買9只,B雞買55.0只,C雞買36.0只
總價:9*3 + 55.0*1 + 36.0*0.5 = 100.0

第12種買法:A雞買8只,B雞買60.0只,C雞買32.0只
總價:8*3 + 60.0*1 + 32.0*0.5 = 100.0

第13種買法:A雞買7只,B雞買65.0只,C雞買28.0只
總價:7*3 + 65.0*1 + 28.0*0.5 = 100.0

第14種買法:A雞買6只,B雞買70.0只,C雞買24.0只
總價:6*3 + 70.0*1 + 24.0*0.5 = 100.0

第15種買法:A雞買5只,B雞買75.0只,C雞買20.0只
總價:5*3 + 75.0*1 + 20.0*0.5 = 100.0

第16種買法:A雞買4只,B雞買80.0只,C雞買16.0只
總價:4*3 + 80.0*1 + 16.0*0.5 = 100.0

第17種買法:A雞買3只,B雞買85.0只,C雞買12.0只
總價:3*3 + 85.0*1 + 12.0*0.5 = 100.0

第18種買法:A雞買2只,B雞買90.0只,C雞買8.0只
總價:2*3 + 90.0*1 + 8.0*0.5 = 100.0

第19種買法:A雞買1只,B雞買95.0只,C雞買4.0只
總價:1*3 + 95.0*1 + 4.0*0.5 = 100.0

方法1:買100只B雞
方法2:買20只A雞、80只C雞
方法3:若A、B、C雞都買,有19種買法
共有21種買法
方法二

循環嵌套循環,計算量非常大

count = 0
M = 0
for A in range(0,34) :
    for B in range(0,101) :
        for C in range(0,201) :
            count += 1
            if A+B+C == 100 and A*3+B*1+C*0.5 == 100 :
                M += 1
                print(f'第{M}種買法:A雞買{A}只,B雞買{B}只,C雞買{C}只')
print(count)

# 方法二優化
count = 0
M = 0
for A in range(0,34) :
    for B in range(0,101) :
        C = 100 - A - B
        count += 1

        if A*3+B*1+C*0.5 == 100 :
            M += 1
            print(f'第{M}種買法:A雞買{A}只,B雞買{B}只,C雞買{C}只')
print(count)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM