输出满足条件的所有组合数

Posted hellowzl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了输出满足条件的所有组合数相关的知识,希望对你有一定的参考价值。

问题:从 1 到 9 中选择 k 个不重复的数字,使它们相加起来等于 n。

例1: 输入 k = 3, n = 7; 输出 [[1,2,4]]

例2: 输入 k = 3, n = 9; 输出 [[1,2,6], [1,3,5], [2,3,4]]

C#代码:

using System;
using System.Collections.Generic;

public class Solution
{
    /// <summary>
    /// 从1到9中,选择k个不同的数字,使其和等于n
    /// </summary>
    /// <param name="k">选择的数字个数</param>
    /// <param name="n">数字的和</param>
    /// <returns>复合条件的数字集合</returns>
    public IList<IList<int>> CombinationSum3(int k, int n)
    {
        int[] allNums = new int[10];
        int[] tagNums = new int[10];
        List<string> results = new List<string>();
        Solution p = new Solution();

        for (int i = 1; i < 10; i++)
        {
            allNums[i - 1] = i;
        }

        //这里备选数字集合为1-9这9个数
        p.Combine(allNums, 9, k, tagNums, k, results);

        IList<IList<int>> correctList = new List<IList<int>>();
        foreach (var res in results)
        {
            int sum = 0;
            List<int> correct = new List<int>();

            //计算各串数字的和
            for (int j = 0; j < res.Length; j++)
            {
                sum += Convert.ToInt16(res[j].ToString());
            }

            if (sum == n)
            {
                for (int m = 0; m <= res.Length - 1; m++)
                {
                    correct.Add(Convert.ToInt16(res[m].ToString()));
                }
                correctList.Add(correct);
            }

            //清空sum的值
            sum = 0;
        }
        return correctList;
    }

    /// <summary>
    /// 输出给定数字范围内的所有组合(非排列)结果
    /// </summary>
    /// <param name="allNums">备选数字集合</param>
    /// <param name="needCount">在备选数字集合中,选择 needCount 个中数字来进行再次选择</param>
    /// <param name="childCount">取 childCount 个数字进行组合</param>
    /// <param name="tagNums">存放每次选中的 childCount 个数字在备选数字集合中的位置</param>
    /// <param name="backupChildCount">存放 childCount 的值</param>
    /// <param name="results">所有组合(非排列)结果</param>
    public void Combine(int[] allNums, int needCount, int childCount, int[] tagNums, int backupChildCount, List<string> results)
    {
        for (int i = needCount; i >= childCount; i--)
        {
            //选择第一个数字,记录它在 allNums 数组中的位置
            tagNums[childCount - 1] = i - 1;

            //如果选中的数字个数未达到 childCount 个,则继续选择下一个
            if (childCount > 1)
            {
                Combine(allNums, i - 1, childCount - 1, tagNums, backupChildCount, results);
            }
            else
            {
                string res = "";
                for (int j = 0; j <= backupChildCount - 1; j++)
                {
                    res += allNums[tagNums[j]].ToString();
                }
                results.Add(res);
            }
        }
    }
}

 

以上是关于输出满足条件的所有组合数的主要内容,如果未能解决你的问题,请参考以下文章

满足特定条件的列表的所有组合

华为OD机试 -合规数组(Java) | 机试题+算法思路+考点+代码解析 2023

华为OD机试 -合规数组(Java) | 机试题+算法思路+考点+代码解析 2023

[CSP-S模拟测试]:简单的括号序列(组合数)

错位+组合排列计数

[SDOI2016] 排列计数 (组合数学)