当前位置:首页>python>Python新手必练|红军干粮分配(双层循环版,枚举法)

Python新手必练|红军干粮分配(双层循环版,枚举法)

  • 2026-10-11 08:04:50
Python新手必练|红军干粮分配(双层循环版,枚举法)

哈喽各位新手宝子~ 之前给大家讲了红军干粮分配的编程题,有宝子问能不能改成「双层循环」,还不要found标志位,安排!

今天就带来 纯双层循环+列表存结果 的版本,逻辑简单到默写无压力,新手也能一眼看懂✅

先回顾题目(怕宝子忘啦)

已知:总干粮total(10≤total≤100),分两种袋子装:

  • 甲袋:每袋装5份,至少用1个

  • 乙袋:每袋装8份,至少用1个

要求:两种袋子都用、干粮恰好装完,输出所有甲袋(a)、乙袋(b)组合(按甲袋从小到大),没有就输出None。

核心思路(重点!)

不用标志位,我们只用「列表」来搞定:

  1. 定义一个空列表result,专门存符合条件的(a,b)组合;

  2. 外层循环:枚举所有可能的甲袋数量a(从1开始,不用算太死范围,给个合理值即可);

  3. 内层循环:对每个a,枚举所有可能的乙袋数量b(也从1开始);

  4. 判断:如果5*a + 8*b 等于总干粮数,就把(a,b)存进列表;

  5. 最后判断列表:有内容就逐行输出,空列表就输出None。

核心就是「暴力枚举」——把所有可能的a和b都试一遍,符合条件就存起来,最后看存没存到东西~

完整代码(可直接复制运行)

# 读取输入的总干粮份数total = int(input())# 定义空列表,专门存符合条件的组合(不用found标志!)result = []# 双层循环:外层枚举甲袋数量a,内层枚举乙袋数量b# 范围给1~21(足够覆盖10~100份干粮的所有可能,新手不用纠结范围)for a in range(1, 21):    for b in range(1, 21):        # 判断是否恰好装完所有干粮        if 5 * a + 8 * b == total:            # 符合条件,就把(a,b)存进列表            result.append((a, b))# 最后判断列表,输出结果if result:    # 列表有内容,逐行输出每组组合    for a, b in result:        print(a, b)else:    # 列表为空,说明没有符合条件的组合    print("None")

逐行拆解(新手必看)

1. 输入处理:total = int(input()) → 读取我们输入的总干粮数(比如53、26);

2. 空列表:result = [] → 相当于一个“小篮子”,专门装正确的(a,b)组合;

3. 外层循环for a in range(1, 21):a从1到20,挨个试甲袋的数量(1个、2个...20个);

4. 内层循环for b in range(1, 21):对每个a,b从1到20挨个试乙袋的数量;

5. 条件判断:5*a + 8*b == total → 试出来刚好装完,就把(a,b)放进“小篮子”;

6. 输出:如果“小篮子”里有东西,就把里面的组合逐行打印;如果是空的,就打印None。

案例测试(直观感受)

举3个典型例子,帮大家验证代码好不好用:

案例1:输入53

循环过程中,会找到两组符合条件的组合:

a=1时,b=6 → 5×1 + 8×6 = 53;

a=9时,b=1 → 5×9 + 8×1 = 53;

列表result里就有[(1,6), (9,1)],输出就是:

1 6

9 1

案例2:输入26

a=2,b=2 → 5×2 + 8×2 = 26,列表里只有[(2,2)],输出:2 2

案例3:输入15

所有a和b试一遍,都达不到5a+8b=15,列表是空的,输出:None

新手小提醒

  • 循环范围1~21完全够用,因为最大total=100,甲袋最多20个(5×20=100),乙袋最多12个(8×12=96),给21的范围是留了冗余,不用精确计算;

  • 全程没有用found=True/False,只用列表存结果,逻辑更清爽,新手更容易理解;

  • 复制代码直接运行,输入题目给的测试用例,就能得到正确输出~

总结一下:双层循环暴力枚举所有a和b,用列表存正确答案,最后判断列表是否为空即可。这种写法不用记复杂的标志位,新手闭眼冲!

如果还是没看懂某个步骤,评论区留言,帮你再拆细~

最新文章

随机文章