百钱买百鸡
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)