前几天在 CSDN 提出一个问题:
各位数字之和为17的七位正整数有多少个?
编程枚举的结果是 67353 个。求如何以数学方法解答。
问题的链接
多数回答是借助 ChatGPT 等大模型工具生成的,没有任何帮助。
也有回答是借鉴动态规划算法的思路。机器算法用于手算,也不是我期待的数学方法。
长假里,终于找到一个数学方法,用组合数学的插板法来求解。
对于 m 个小球,有序分成 n 组,允许组为空,其分组方案数为:C(m+n-1,n-1)
即:m 个小球加上 n 个,成为 m+n 个,其中有 m+n-1 个间隔;在这些间隔中选择 n-1 个,插入隔板,将其分为有序的 n 组;每组拿去一个小球,得到所需分组方案。
组合计算的公式: C(a,b) = a! / b! / (a-b)!
所求即为 a 个元素中选择 b 个的组合数量。
第一步,计算不限组内球数的总方案数:
17 个小球分组方案的总数:C(17+7-1,7-1) = 100947;
0 在首位的情形,即:C(17+6-1,6-1) = 26334;
总方案数为:100947-26334 = 74613 个。
第二步,计算需要扣除的组内球数超过 9 的情形:
以某组中 10 个小球为例,其它组的小球总和为 17-10 = 7 个,分成 6 组;这个球数为 10 的组,可以放在 7 个不同的位置上;即:7C(7+6-1,6-1) = 7C(12,5);
同样需要扣除 0 在首位的情形,参照上述分析,这个球数为 10 的组可以放在 6 个不同的位置上;即:6C(7+5-1,5-1) = 6C(11,4);
得到需要扣减的分组内含 10 个小球的方案数为:7C(12,5)-6C(11,4) 个。
对应于组中不同的小球数 10~17 需要扣除的方案数分别为:
10:7C(12,5)-6C(11,4) = 3564;
11:7C(11,5)-6C(10,4) = 1974;
12:7C(10,5)-6C(9,4) = 1008;
13:7C(9,5)-6C(8,4) = 462;
14:7C(8,5)-6C(7,4) = 182;
15:7C(7,5)-6C(6,4) = 57;
16:7C(6,5)-6C(5,4) = 12;
17:7C(5,5)-6C(4,4) = 1;
得到总扣减方案数:3564+1974+1008+462+182+57+12+1 = 7260 个。
第三步,计算总方案数:
74613-7260 = 67353 个。