Python动态规划分组计数函数结果不符,求调试解决
问题排查与代码修正
核心问题分析
你的代码存在两个关键错误:
- 递推公式错误:你使用了
(j-2)*table[i-1][j] + (j-1)*table[i-1][j-1],但符合问题要求的正确递推式应为G(n,k) = G(n-1,k-1) + k × G(n-1,k)。 - 遗漏基础条件判断:未处理
k < 3的情况——由于三胞胎必须分在不同组,分组数至少为3,否则方案数为0。
递推式推导依据
问题要求三胞胎必须分在不同组,新增的普通学生有两种分组选择:
- 单独成立一个新组:对应方案数
G(n-1,k-1)(前n-1个学生已分成k-1个合法组) - 加入已有的k个组中的任意一个:对应方案数
k × G(n-1,k)(每个组都可以接收这个普通学生)
修正后的代码
def count_partitions(n, k): # 基础条件:分组数不足3,或学生数少于分组数,均无法合法分组 if n < k or k < 3: return 0 # 3个三胞胎分3组,仅1种方案 elif n == k == 3: return 1 # 初始化DP表,所有元素默认0 table = [[0] * (k + 1) for _ in range(n + 1)] table[3][3] = 1 # 初始合法状态 # 填充DP表 for i in range(4, n + 1): for j in range(3, k + 1): # 应用正确的递推公式 table[i][j] = table[i-1][j-1] + j * table[i-1][j] return table[n][k]
验证结果
count_partitions(4, 3)→ 3(符合预期)count_partitions(5, 3)→ 9(符合预期)count_partitions(6, 4)→ 37(符合预期)
内容的提问来源于stack exchange,提问作者Muhammad Daud
相关产品推荐
相关产品推荐

