给定台阶总数和两种单次可跳级数,编写自定义函数,计算所有的游戏组合方案数量。
(笔记模板由python脚本于2023年11月19日 19:18:48创建,本篇笔记适合熟悉python自定义函数编写,了解排列组合知识的coder翻阅)
Python 官网:https://www.python.org/
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
地址:https://lqpybook.readthedocs.io/
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
本文质量分:
CSDN质量分查询入口:http://www.csdn.net/qc
【题目来源于 CSDN 问答社区提问“Jump Level Game”】
我的解法很笨,就是穷举所有a、b组合到levels = n的方案,最后输出总方案数量。(这初期的想法,不切实际啊)
用两层for来遍历a、b的所有组合,打印每一种a、b组合的可能方案数,函数返回累加的最后结果。
python代码
def jumps(n, a, b): # 计算所有不同游戏组合函数。
a1, b1 = not n%a, not n%b # a、b整除于n的bool型变量
count = 2 if a1 and b1 else 1 if a1 or b1 else 0 # 单独用a、b完成游戏组合数。
for i in range(1, n//a + 1):
for j in range(1, n//b + 1):
m = i + j
if a*i + b*j == n and j:
less = min((i, j))
count2 = comCount(i+j, less)
count += count2
return count
组合方案中,a、b的数量有“b的数量 = a、b总量 - a的数量”的关系。所以,可以用这个关系去除嵌套的内层for,提升代码效率。
python代码
def jumps(n, a, b): # 计算所有不同游戏组合函数。
#print(f"\nn, a, b = {n}, {a}, {b}\n\n计算过程:")
a1, b1 = not n%a, not n%b
count = 2 if a1 and b1 else 1 if a1 or b1 else 0 # 单独用a、b完成游戏的方。
k = 1
for i in range(1, n//a + 1):
j = (n - a*i)//b
m = i + j
if a*i + b*j == n and j:
less = min((i, j))
count2 = comCount(i+j, less)
#print(f"\n{k}、{a}×{i} + {b}×{j} = {n}\n{'':>3}{i+j}个位置中取{less}个,有{count2}种组合")
k += 1
count += count2
return count
求a、b中较少者在a、b总数量中的组合数。为什么是求a、b中数量小者总数量?因为在一定范围内取值组合数量,是一次取值数量越小越多。数量大者,组合少,且与较小数量组合重复,所以只取大的就好。
如:4, 1, 2
12 + 21 = 4
从3个位置中取1个有三种,可以是任何一个位置;取2有也三种要么1、3,要么2、3,要么1、2。a的位置变化会,引起b的变化,所以只计算较小者组合数量。
不同组合单行匿名函数
comCount = lambda n,m: len(list(combinations([0]*n, m))) # 求不同组合单行匿名函数。
求a、b中较少者在a、b总数量中的组合数
for i in range(1, n//a + 1):
j = (n - a*i)//b
m = i + j
if a*i + b*j == n and j:
less = min((i, j))
count2 = comCount(i+j, less)
(源码较长,点此跳过源码)
#!/sur/bin/nve python
# coding: utf-8
from itertools import combinations
comCount = lambda n,m: len(list(combinations([0]*n, m))) # 求不同组合单行匿名函数。
def jumps(n, a, b): # 计算所有不同游戏组合函数。
#print(f"\nn, a, b = {n}, {a}, {b}\n\n计算过程:")
a1, b1 = not n%a, not n%b
count = 2 if a1 and b1 else 1 if a1 or b1 else 0 # 单独用a、b完成游戏的方。
k = 1
for i in range(1, n//a + 1):
j = (n - a*i)//b
m = i + j
if a*i + b*j == n and j:
less = min((i, j))
count2 = comCount(i+j, less)
#print(f"\n{k}、{a}×{i} + {b}×{j} = {n}\n{'':>3}{i+j}个位置中取{less}个,有{count2}种组合")
k += 1
count += count2
return count
if __name__ == "__main__":
print(jumps(4, 1, 2))
print(jumps(8, 2, 3))
print(jumps(11, 6, 7))
print(jumps(30, 3, 5))
print(jumps(100, 4, 5))
#n, a, b, result = 4, 1, 2, 5
#n, a, b, result = 8, 2, 3, 4
#n, a, b, result = 11, 6, 7, 0
#n, a, b, result = 30, 3, 5, 58
#n, a, b, result = 100, 4, 5, 1167937
#print(f"\n预期输出:{result}\n实际输出:{jumps(n, a, b)}")
我的HOT博:
本次共计收集 246 篇博文笔记信息,总阅读量 40.46w,平均阅读量 1644。已生成 16 篇阅读量不小于 4000 的博文笔记索引链接。数据采集于 2023-10-12 05:41:03 完成,用时 4 分 41.10 秒。
精品文章:
来源:老齐教室
◆ Python 入门指南【Python 3.6.3】
好文力荐:
CSDN实用技巧博文: