AcWing 93. 遞歸實現組合型枚舉

AcWing 93. 遞歸實現組合型枚舉

原題連接ios

從 1~n 這 n 個整數中隨機選出 m 個,輸出全部可能的選擇方案。c++

輸入格式

兩個整數 n,m ,在同一行用空格隔開。數組

輸出格式

按照從小到大的順序輸出全部方案,每行1個。優化

首先,同一行內的數升序排列,相鄰兩個數用一個空格隔開。spa

其次,對於兩個不一樣的行,對應下標的數一一比較,字典序較小的排在前面(例如1 3 5 7排在1 3 6 8前面)。code

數據範圍

n>0 ,
0≤m≤n ,
n+(n−m)≤25遞歸

輸入樣例:

5 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

思考題:若是要求使用非遞歸方法,該怎麼作呢?ci

題解

仍然是遞歸搜索樹,枚舉方案爲:依次枚舉每一個位置上的數是幾;get

本題又用到剪枝來對代碼進行了優化,若是發現某方案無解,則能夠提早退出。string

dfs參數中:

1.表示m個位置,開一個數組存儲env[N];

2.loc表示當前枚舉到了哪一個位置;

3.sma當前最小能夠從哪一個數枚舉 。

代碼實現

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>

using namespace std;
const int N = 29;
int n,m;
int env[N];
void dfs(int loc,int sma)//當前枚舉到了哪一個位置、當前最小能夠從哪一個數枚舉 
{
	//剪枝 
	if(loc+n-sma<m) return;//已經選了loc-1個數    假設把sma到n所有選上(n-sma+1)也不夠m個數(<m)
	
	if(loc==m+1)//表示枚舉結束
	{
		for(int i=1;i<=m;i++) cout<<env[i]<<' ';
		cout<<endl;
		return;
	}
	for(int i=sma;i<=n;i++)
	{
		env[loc]=i;
		dfs(loc+1,i+1);
		
		env[loc]=0;
	}
}
int main()
{
    cin>>n>>m;
    dfs(1,1);//初始從第1個位置開始枚舉、最小能夠枚舉的數爲1 
    return 0;
}
相關文章
相關標籤/搜索