You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何找出和为n的k个正整数的所有排列型分拆?

生成k个正整数和为n的所有排列分拆

我们需要找出所有由k个正整数组成、和为n的分拆(包含所有排列形式)。比如当k=4、n=6时,基础分拆为:

1 + 1 + 1 + 3 = 6
1 + 1 + 2 + 2 = 6

每个基础分拆的所有排列都要纳入结果,比如[1,1,1,3]有4种排列,[1,1,2,2]有6种排列,最终结果共10种。

Julia 优化实现

原代码先生成全排列再去重,存在大量冗余计算。改用multiset_permutations可直接生成每个基础分拆的唯一排列,效率大幅提升:

using Combinatorics
n, k = 6, 4
result = []
for part in partitions(n, k)
    append!(result, multiset_permutations(part))
end
# 可选:确保结果无重复(multiset_permutations已保证唯一,此步可省略)
result = unique(result)

Python 实现

方案1:依赖sympy(高效)

利用multiset_permutations直接生成唯一排列:

from sympy.utilities.iterables import multiset_permutations
from itertools import combinations_with_replacement

n, k = 6, 4
result = []

# 生成所有非降序的基础分拆(k个正整数和为n)
for combo in combinations_with_replacement(range(1, n - k + 2), k):
    if sum(combo) == n:
        result.extend(multiset_permutations(combo))

# 转换为列表并去重(基础分拆唯一时此步可简化)
result = [list(p) for p in set(tuple(p) for p in result)]

方案2:不依赖第三方库(兼容性好)

用combinations_with_replacement生成基础分拆,结合集合自动去重排列:

from itertools import combinations_with_replacement, permutations

n, k = 6, 4
result_set = set()

for combo in combinations_with_replacement(range(1, n - k + 2), k):
    if sum(combo) == n:
        for p in permutations(combo):
            result_set.add(p)

result = list(result_set)

优化思路

先找到非降序的基础分拆(避免重复处理相同结构的分拆),再对每个基础分拆生成其所有唯一排列,从根源减少冗余计算,比先生成全排列再去重的效率高得多。

内容的提问来源于stack exchange,提问作者zdm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 20:25:22