百錢買百雞
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)