美味度配方:配料调配(for循环嵌套使用)

75 篇文章 0 订阅

8 种配料每种配料可以放 1 到 5 克,美味度为配料质量之和,给定一个美味度 n,求解 8 种配料的所有搭配方案及方案数量 。


  (本笔记适合学了 Python 循环,正在熟炼的 coder 翻阅)


【学习的细节是欢悦的历程】


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


等风来,不如追风去……


8 种配料 1~5 克,美味度为配料质量之和
美 食  配 方
(给定美味度 n,求解配料所有配方及数量 )


本文质量分:

96
本文地址: https://blog.csdn.net/m0_57158496/article/details/131279828

CSDN质量分查询入口:http://www.csdn.net/qc


目 录


◆ 美食配方


1、题目描述


  某餐厅厨师制作美食需要用到 8 种配料(盐、芥末、糖等),每种配料可以放 1 到 5 克,美食的美味度为所有配料质量之和。如果给定一个美味度 n,求解具有该美味度的 8 种配料的所有搭配方案及方案数量。


【输入形式】
一个正整数 n (n<=100),表示美味度。


【输出形式】
1.方案总数 = 0,输出 0 ;
2. 1 <= 方案总数 <= 5,按字典序排列输出所有搭配方案,最后一行输出方案总数;
3. 方案总数 > 5 ,按字典序排列输出前 5 种搭配方案,最后一行输出方案总数;


:每行用空格隔开输出 8 种配料的质量,表示 1 种搭配方案。


回页目录

2、题解

2.1 八层for 循环


  用八层 for 嵌套,可以打印输出所有满足条件的“美味配方”到终端屏幕 (8层for按字典序遍历八种作料的全部组合,用if语句筛选出符题组合打印)

for a1 in range(1, 6):
    for a2 in range(1, 6):
        for a3 in range(1, 6):
            for a4 in range(1, 6):
                for a5 in range(1, 6):
                    for a6 in range(1, 6):
                        for a7 in range(1, 6):
                            for a8 in range(1, 6):
                                count = sum([a1, a2, a3, a4, a5, a6, a7, a8])
                                
                                if count == delicious:
                                    counts += 1 # 统计配方总数。
                                    print(', '.join([f"{k}: {v}" for k,v in zip(['a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8'], [a1, a2, a3, a4, a5, a6, a7, a8])]))


  题目要求是大于五个配方的美味度,只列印字典序前五条配方。由于采用的 for 循环嵌套遍历,本就从字典序,只输出前五条就好。


if counts <= 5:
print(', '.join([f"{k}: {v}" for k,v in zip(['a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8'], [a1, a2, a3, a4, a5, a6, a7, a8])]))

  • 代码运行效果截屏图片
    在这里插入图片描述


回页目录

2.2 Python 优雅的解析式


   Python 优雅的解析式,可以把八层 for 写成一行,生成以 zip() 类型为元素的列表,每个 zip() 类型元素对象就是一组“美味配方”,遍历配方列表前5就好。( 8 层 for 本就是按字典序穷举遍历,所以直接打印前五就可以)

  解析式的效率比for循环稍高,此操作在优雅代码的同时,也优化了一下算法,让程序的性能有了些微提升。



result = [zip(('a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8'), (a1, a2, a3, a4, a5, a6, a7, a8)) for a1 in range(1, 6)  for a2 in range(1, 6)  for a3 in range(1, 6)  for a4 in range(1, 6)  for a5 in range(1, 6)  for a6 in range(1, 6)  for a7 in range(1, 6)  for a8 in range(1, 6) if sum((a1, a2, a3, a4, a5, a6, a7, a8)) == delicious]

for i in result[:5]:
    print(f"{', '.join((f'{k}: {v}' for k,v in i))}")

print(f"{'':~^41}\n{' 以上是字典序前五配方 ':^31}")
print(f"\n{'':>13}配方总数:{len(result)}\n{'':~^41}")


  • 代码运行效果截屏图片

    print(result[:5]) ,接打印前组“美味配方”就是——
    在这里插入图片描述

    for i in result[:5]:
      print(f"{’, ‘.join((f’{k}: {v}’ for k,v in i))}")

    插值字符串格式打印,就是——
    在这里插入图片描述


回页目录

2.3 算法优化


  由于八种配方的组合太多(8!×5!),遍历用时较长。由题目描述可知,每种调料最少1克最多5克。所以当美味度小于8和大于40,是无解的。所以用if判定,美味度在此范围,直接输出0后退出程序,后面的遍历就不必执行了。
  当美味度分别是8和40时,都仅有一个组合,也可以直接输出。

  经此优化,程序对“美味度”配方总数是0或1的输入,就可收“秒显”,做到“零”时间回应。


if delicious < 9 or delicious > 39:
    counts = 1 if (delicious == 8 or delicious == 40) else 0

    if counts == 1:
        print(f"\n{' 配方罗列 ':~^37}") 
        print(', '.join([f"{k}: {v}" for k,v in zip(['a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8'], [1]*8)]))

    print(f"\n{'':>10}配方总数:{counts}\n{'':~^41}")
    exit()



回页目录

3、完整源码

(源码较长,点此跳过源码)

#!/sur/bin/nve python
# coding: utf-8


counts = 0
delicious = int(input('\n请输入美味度0~100(如27):').strip())

if delicious < 9 or delicious > 39:
    counts = 1 if (delicious == 8 or delicious == 40) else 0

    if counts == 1:
        print(f"\n{' 配方罗列 ':~^37}") 
        print(', '.join([f"{k}: {v}" for k,v in zip(['a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8'], [1]*8)]))

    print(f"\n{'':>10}配方总数:{counts}\n{'':~^41}")
    exit()

print(f"\n{' 配方罗列 ':~^37}") 

result = [zip(('a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8'), (a1, a2, a3, a4, a5, a6, a7, a8)) for a1 in range(1, 6)  for a2 in range(1, 6)  for a3 in range(1, 6)  for a4 in range(1, 6)  for a5 in range(1, 6)  for a6 in range(1, 6)  for a7 in range(1, 6)  for a8 in range(1, 6) if sum((a1, a2, a3, a4, a5, a6, a7, a8)) == delicious]

#print(result[:5]) # 打印配方字典序前五zip()类型对象。

for i in result[:5]:
    print(f"{', '.join((f'{k}: {v}' for k,v in i))}")

print(f"{'':~^41}\n{' 以上是字典序前五配方 ':^31}")
print(f"\n{'':>13}配方总数:{len(result)}\n{'':~^41}")


回页首

上一篇:  模拟随机验证码(模拟随机验证码)
下一篇: 

我的HOT博:

  本次共计收集 213 篇博文笔记信息,总阅读量 30.40w,平均阅读量 1427。已生成 21 篇阅读量不小于 3000 的博文笔记索引链接。数据采集于 2023-06-18 22:38:02 完成,用时 4 分 22.04 秒。


  1. 让QQ群昵称色变的神奇代码
    ( 55929 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/122566500
    点赞:24   踩 :0  收藏:81  打赏:0  评论:17
    本篇博文笔记于 2022-01-18 19:15:08 首发,最晚于 2022-01-20 07:56:47 修改。
  2. pandas 数据类型之 DataFrame
    ( 8664 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/124525814
    点赞:6   踩 :0  收藏:29  打赏:0  评论:0
    本篇博文笔记于 2022-05-01 13:20:17 首发,最晚于 2022-05-08 08:46:13 修改。
  3. 个人信息提取(字符串)
    ( 6709 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/124244618
    点赞:1   踩 :0  收藏:11  打赏:0  评论:0
    本篇博文笔记于 2022-04-18 11:07:12 首发,最晚于 2022-04-20 13:17:54 修改。
  4. 罗马数字转换器|罗马数字生成器
    ( 6600 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/122592047
    点赞:0   踩 :0  收藏:1  打赏:0  评论:0
    本篇博文笔记于 2022-01-19 23:26:42 首发,最晚于 2022-01-21 18:37:46 修改。
  5. Python字符串居中显示
    ( 6516 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/122163023
    点赞:1   踩 :0  收藏:6  打赏:0  评论:1
    本篇博文笔记于 2021-12-26 23:35:29 发布。
  6. 斐波那契数列的递归实现和for实现
    ( 5367 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/122355295
    点赞:4   踩 :0  收藏:2  打赏:0  评论:8
    本篇博文笔记于 2022-01-06 23:27:40 发布。
  7. Python列表(list)反序(降序)的7种实现方式
    ( 5317 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/128271700
    点赞:4   踩 :0  收藏:18  打赏:0  评论:8
    本篇博文笔记于 2022-12-11 23:54:15 首发,最晚于 2023-03-20 18:13:55 修改。
  8. 练习:字符串统计(坑:f‘string‘报错)
    ( 4948 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/121723096
    点赞:0   踩 :0  收藏:1  打赏:0  评论:0
    本篇博文笔记于 2021-12-04 22:54:29 发布。
  9. 练习:尼姆游戏(聪明版/傻瓜式•人机对战)
    ( 4701 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/121645399
    点赞:14   踩 :0  收藏:42  打赏:0  评论:0
    本篇博文笔记于 2021-11-30 23:43:17 发布。
  10. python清屏
    ( 4623 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/120762101
    点赞:0   踩 :0  收藏:5  打赏:0  评论:0
    本篇博文笔记于 2021-10-14 13:47:21 发布。
  11. 回车符、换行符和回车换行符
    ( 4578 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/123109488
    点赞:1   踩 :0  收藏:2  打赏:0  评论:0
    本篇博文笔记于 2022-02-24 13:10:02 首发,最晚于 2022-02-25 20:07:40 修改。
  12. 密码强度检测器
    ( 4015 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/121739694
    点赞:1   踩 :0  收藏:4  打赏:0  评论:0
    本篇博文笔记于 2021-12-06 09:08:25 首发,最晚于 2022-11-27 09:39:39 修改。
  13. 练习:生成100个随机正整数
    ( 3997 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/122558220
    点赞:1   踩 :0  收藏:6  打赏:0  评论:0
    本篇博文笔记于 2022-01-18 13:31:36 首发,最晚于 2022-01-20 07:58:12 修改。
  14. 罗马数字转换器(用罗马数字构造元素的值取模实现)
    ( 3900 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/122608526
    点赞:0   踩 :0  收藏:0  打赏:0  评论:0
    本篇博文笔记于 2022-01-20 19:38:12 首发,最晚于 2022-01-21 18:32:02 修改。
  15. 练习:班里有人和我同生日难吗?(概率probability、蒙特卡洛随机模拟法)
    ( 3708 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/124424935
    点赞:1   踩 :0  收藏:3  打赏:0  评论:0
    本篇博文笔记于 2022-04-26 12:46:25 首发,最晚于 2022-04-27 21:22:07 修改。
  16. 我的 Python.color() (Python 色彩打印控制)
    ( 3648 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/123194259
    点赞:2   踩 :0  收藏:7  打赏:0  评论:0
    本篇博文笔记于 2022-02-28 22:46:21 首发,最晚于 2022-03-03 10:30:03 修改。
  17. 练习:仿真模拟福彩双色球——中500w巨奖到底有多难?跑跑代码就晓得了。
    ( 3409 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/125415626
    点赞:3   踩 :0  收藏:4  打赏:0  评论:3
    本篇博文笔记于 2022-06-22 19:54:20 首发,最晚于 2022-06-23 22:41:33 修改。
  18. 聊天消息敏感词屏蔽系统(字符串替换 str.replace(str1, *) )
    ( 3221 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/124539589
    点赞:3   踩 :0  收藏:2  打赏:0  评论:3
    本篇博文笔记于 2022-05-02 13:02:39 首发,最晚于 2022-05-21 06:10:42 修改。
  19. random.sample()将在python 3.9x后续版本中被弃用
    ( 3204 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/120657230
    点赞:0   踩 :0  收藏:0  打赏:0  评论:0
    本篇博文笔记于 2021-10-08 18:35:09 发布。
  20. Linux 脚本文件第一行的特殊注释符(井号和感叹号组合)的含义
    ( 3190 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/123087606
    点赞:0   踩 :0  收藏:4  打赏:0  评论:3
    本篇博文笔记于 2022-02-23 13:08:07 首发,最晚于 2022-04-04 23:52:38 修改。
  21. 练习:求列表(整数列表)平衡点
    ( 3087 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/121737612
    点赞:0   踩 :0  收藏:0  打赏:0  评论:0
    本篇博文笔记于 2021-12-05 23:28:10 发布。
推荐条件 阅读量突破三千
(更多热博,请点击蓝色文字跳转翻阅)

回页首


老齐漫画头像

精品文章:

来源:老齐教室


回页首

Python 入门指南【Python 3.6.3】


好文力荐:


CSDN实用技巧博文:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦幻精灵_cq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值