zoukankan      html  css  js  c++  java
  • 【递归入门】组合的输出:dfs

    题目描述

    排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r < = n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数。 
    现要求你不用递归的方法输出所有组合。 
    例如n = 5 ,r = 3 ,所有组合为: 
    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 

    输入

    一行两个自然数n、r ( 1 < n < 21,1 < = r < = n )。

    输出

    所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,所有的组合也按字典顺序。

    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    int n, r,a[30],book[30];
    void dfs(int x)//参数用来表示状态
    {
    	if (x==r+1)
    	{
    		for (int i = 1; i <= r; i++)
    			cout << a[i]<<" ";
    		cout << "
    ";
    			return;
    	}
    	for (int i = 1; i <= n;i++)
    	{
    		if (book[i]==0&&i>a[x-1])//   i>a[x-1]   是升序
    		{
    			a[x] = i;
    			book[i] = 1;// 标记;
    			dfs(x + 1);
    			book[i] = 0;//回溯
    		}
    	}
    	return;
    }
    int main()
    {
    	cin >> n>>r;
    	dfs(1);
    	return 0;
    }
    

      

  • 相关阅读:
    hdu1814 Peaceful Commission 2-SAT
    上传下载文件
    文件下载类
    文件操作类
    MD5加密帮助类
    加密解密类
    发送邮件函数
    DataTable 分页
    服务器缓存帮助类
    Cookie帮助类
  • 原文地址:https://www.cnblogs.com/52dxer/p/10371575.html
Copyright © 2011-2022 走看看