栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

7-3 前t个组合结果 (25 分)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

7-3 前t个组合结果 (25 分)

题目

找出从自然数1、2、… 、n(0 输入格式

在一行中输入n、r、t(1<=t<=C(n,r))。

输出格式

按特定顺序输出前t个组合结果,每一个组合结果占一行,含第一个整数在内的每一个整数前面都用一个空格,最后一个整数后面没有空格。 特定顺序:每一个组合结果中的值从大到小排列,组合之间按逆字典序排列。

输入样例
5 3 10
6 4 8
输出样例
 5 4 3
 5 4 2
 5 4 1
 5 3 2
 5 3 1
 5 2 1
 4 3 2
 4 3 1
 4 2 1
 3 2 1
 6 5 4 3
 6 5 4 2
 6 5 4 1
 6 5 3 2
 6 5 3 1
 6 5 2 1
 6 4 3 2
 6 4 3 1
基本思路

有点类似于全排列问题的变式,用回溯的思想解决。

代码
#include 
using namespace std;

int n,r,t;//1~n;取几个数字;共需要几组组合
int m=0;//满足条件的组合个数
int a[35],book[35];//存放一组组合;下标为某个数字,值表示这个数字能否被取走
//pos代表这次dfs需要填充数组a的哪个位置,n代表这次dfs中i从n开始逆向枚举到1(还需要经过数组book判断这个i到底能不能取走)
void dfs(int n,int pos){
    //程序终止
    if(m==t){//组合个数已经够了,直接退出程序,减少运行时间
        exit(0);
    }
    //递归边界,返回最近一次调用dfs函数的地方
    if(pos>r){//在一组组合中,只取r个数字,在取第r+1个数字的dfs中,回溯
        return;
    }
    for(int i=n;i>=1;i--){//枚举i从n到1
        if(book[i]==0){
            book[i]=1;
            a[pos]=i;
            //如果当前数组下标等于要取的数字个数,说明一组组合已经生成,输出                                                                                                           
            if(pos==r){
                m++;//组合数加1
                for(int j=1;j<=pos;j++){
                    cout<<" "<>n>>r>>t){
        dfs(n,1);//从(int n=n,int pos=1)开始dfs
    } 
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/648926.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号