百钱买百鸡

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)