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

求生成正整数唯一拆分组合的Python算法(用于填字游戏)

正整数拆分组合生成算法(用于填字游戏单词组匹配)

需求说明

我们需要实现一个算法,生成所有由正整数相加得到目标数的无序组合(组合内数字非递增,避免重复),最终输出为数组形式,用于匹配对应长度的单词组。同时支持以下可选规则:

  • 排除包含1的组合(对应1字符单词)
  • 排除仅包含目标数本身的组合(对应与目标长度相同的单词)
  • 目标数最大限制为15

Python实现代码

def generate_number_combinations(target, exclude_one=False, exclude_single=False):
    combinations = []
    
    def backtrack(remaining, start, path):
        if remaining == 0:
            # 根据规则过滤组合
            if exclude_single and len(path) == 1:
                return
            if exclude_one and 1 in path:
                return
            combinations.append(path.copy())
            return
        # 从start开始遍历,保证非递增,避免重复组合
        for num in range(start, remaining + 1):
            path.append(num)
            backtrack(remaining - num, num, path)
            path.pop()
    
    backtrack(target, 1, [])
    return combinations

# 测试示例:目标数6
if __name__ == "__main__":
    print("目标数6的所有组合:")
    all_combinations = generate_number_combinations(6)
    for combo in all_combinations:
        print(f"6 = {' + '.join(map(str, combo))}")
    
    print("\n排除1和单元素组合后的结果:")
    filtered_combinations = generate_number_combinations(6, exclude_one=True, exclude_single=True)
    for combo in filtered_combinations:
        print(combo)

代码说明

  1. 核心逻辑:使用回溯法,通过start参数控制每次选择的数字不小于当前组合的最后一个数字,确保生成的组合是非递增的,彻底避免重复(比如不会同时生成[5,1]和[1,5])。
  2. 可选过滤:
    • exclude_one=True:会跳过所有包含1的组合
    • exclude_single=True:会跳过仅包含目标数本身的组合(如[6])
  3. 数值限制:因为目标数最大为15,当前实现无需额外优化即可高效处理。

输出示例

运行测试代码后,目标数6的所有组合会和题目给出的示例完全一致;过滤后的结果为:

[4, 2]
[3, 3]
[2, 2, 2]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:20:31