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

问题:从 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);
            }
        }
    }
}
时间: 2024-10-29 02:49:27

输出满足条件的所有组合数的相关文章

Python自动化--语言基础2--运算符、格式化输出、条件语句、循环语句、列表、元组

运算符包括:算术运算符.比较运算符.赋值运算符.逻辑运算符.成员运算符.身份运算符 算术运算符 %   取模(余数) //  取相除的整数部分 /   (5/2=2.5) 比较运算符 ==  等于 !=  不等于 <   小于 >   大于 <=  小于等于 >=  大于等于 1 if a==b: 2 print(1) 3 else: 4 print(2) 赋值运算符 a+=b   等于 a=a+b a-=b          a=a-b a*=b          a=a*b a

python之MySQL学习——输出指定条件的结果集

1 # 引入pymysql模块 2 import pymysql as pm 3 4 # 数据库连接 5 db = pm.connect(host='localhost', user='root', password="123456",database='task', charset='utf8') 6 # 建立游标 7 cur = db.cursor() 8 # 设置sql语句 9 sql = 'SELECT * FROM video_info WHERE actor_name=%s

通过文件内容,输出符合条件的文件名

找出当前目录下所有含"aop"字符的文件,去掉脚本自己的名字,注意使用sh执行这儿脚本,否则,用./1.sh调用,过滤的是./1.sh,而不是1.sh [[email protected]_48_191_centos 456]# cat 1.sh #!/bin/bash for i in `ls` do m=`cat $i|grep aop` if [ -n "$m" ] then echo "$i" >>/root/456/6.tx

多重集组合数 简单dp

1 #include <cstdio> 2 #include <iostream> 3 4 using namespace std; 5 6 const int max_n = 1000+2; 7 const int max_m = 1000+2; 8 const int max_a = 1000+2; 9 const int max_M = 1e4+2; 10 11 int n,m,M; 12 int a[max_n]; 13 int dp[max_M][max_M]; 14 /

循环-03. 求符合给定条件的整数集(15)

给定不超过6的正整数A,考虑从A开始的连续4个数字.请输出所有由它们组成的无重复数字的3位数. 输入格式: 输入在一行中给出A. 输出格式: 输出满足条件的的3位数,要求从小到大,每行6个整数.整数间以空格分隔,但行末不能有多余空格. 输入样例: 2 输出样例: 234 235 243 245 253 254 324 325 342 345 352 354 423 425 432 435 452 453 523 524 532 534 542 543 #include<stdio.h> int

Python基础-条件语句(判断)

Python条件语句  python中的条件语句和其他语言中的条件语句一样都是通过if...else或者if...elif...else这样的方式实现的,他们的实现方式是通过一条或者多条的执行结果(真(True)或者假(False))来决定执行的代码块的. 下面这张图简单的描述了一下执行的流程: python中指定任何非0或者非空(null)的值为True,指定任何0或者空(null)的值为False python在代码中if判断语句的执行方式或者说是if的语法形式为: if 需要判断的条件:

循环-22. 输出闰年

输出21世纪中截止某个年份以来的所有闰年年份.注意:闰年的判别条件是该年年份能被4整除但不能被100整除.或者能被400整除. 输入格式: 输入在一行中给出21世纪的某个截止年份. 输出格式: 逐行输出满足条件的所有闰年年份,即每个年份占一行.输入若非21世纪的年份则输出"Invalid year!". 输入样例 1: 2048 输出样例 1: 2004 2008 2012 2016 2020 2024 2028 2032 2036 2040 2044 2048 输入样例 2: 200

4-0. 求符合给定条件的整数集

给定不超过6的正整数A,考虑从A开始的连续4个数字.请输出所有由它们组成的无重复数字的3位数. 输入格式: 输入在一行中给出A. 输出格式: 输出满足条件的的3位数,要求从小到大,每行6个整数.整数间以空格分隔,但行末不能有多余空格. 输入样例: 2 输出样例: 234 235 243 245 253 254 324 325 342 345 352 354 423 425 432 435 452 453 523 524 532 534 542 543 [代码示例]: #include <stdi

04-0. 求符合给定条件的整数集(15)

给定不超过6的正整数A,考虑从A开始的连续4个数字.请输出所有由它们组成的无重复数字的3位数. 输入格式: 输入在一行中给出A. 输出格式: 输出满足条件的的3位数,要求从小到大,每行6个整数.整数间以空格分隔,但行末不能有多余空格. 输入样例: 2 输出样例: 234 235 243 245 253 254 324 325 342 345 352 354 423 425 432 435 452 453 523 524 532 534 542 543   方法1: #include "stdio