• 【4005】组合的输出


    Time Limit: 10 second
    Memory Limit: 20 MB

    排列与组合是常用的数学方法,其中组合就是从n个数元素中抽出r个元素(不分顺序且,r≤n),我们可以简单地将n个元素理解为自然数1,2......n,从中任取r个数。
    现要求你用递归的方法输出所有的组合,以及组合的总数。

    Input

    输入文件仅一行,输入两个自然数n,r(1≤n≤21,1≤r≤n)。

    Output

    首先,输出所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列(每个元素用一个空格隔开,每行行末用换行结束)。
    最后,输出组合的总数格式为:sum=组合的总数,最后用换行结束。

    Sample Input

    5 3
    
    

    Sample Output

    1 2 3
    1 2 4
    1 2 5
    1 3 4
    1 3 5
    1 4 5
    2 3 4
    2 3 5
    2 4 5
    3 4 5
    sum=10
    

    【题解】

    同样是深搜,限制条件有:右边的数字大于左边。r个数字的组合。具体的在程序中讲。

    【代码】

    #include <cstdio>
    
    int n,r,number = 0,a[25],sum = 0;
    
    void input_data()
    {
        scanf("%d %d",&n,&r); //输入数据 
    }
    
    void search(int t) //dfs 
    {
    	if (number == r) return; //如果已经完成搜索 退出 
    	a[++number] = t; //记录当前搜到的数字 并记录 
    	for (int i = t+1;i <= n;i++) // 要求右边的数字大于左边,则从t+1开始枚举 
    		search(i);
    	if (number == r) //如果已经搜完 则输出 sum递增 
    		{
    		    for (int i = 1;i <= number-1;i++)
    			    printf("%d ",a[i]);
    			printf("%d
    ",a[number]);
    			sum++;
    		}
    	number--; //回溯 回到搜索这个数字之前的状态。 
    }
    
    void get_ans()
    {
        for (int i = 1;i <= n-r+1;i++) //n-r+1可以直接改成n,dfs中的剪枝可以很快排除不符合的情况 
        	search(i);
        printf("sum=%d
    ",sum);
    }
    
    int main()
    {
        input_data();
        get_ans();
        return 0;	
    }
    


     

  • 相关阅读:
    ASP.NET MVC学习笔记-----ActionInvoker
    quartz启动报错
    THUSC 2021 游记
    C++下随机数的生成
    友链
    memset一些技巧
    CodeForces Round #705 总结&题解
    php计算两坐标距离
    vue中使用keepAlive组件缓存遇到的坑
    vue 中 keepAlive
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632495.html
Copyright © 2020-2023  润新知