93. 递归实现组合型枚举

 

 

题解:递归方法,在上一题的题解上面加一个限定就行了
点击查看代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef pair<int,int> pll;
typedef long long ll;
const int N=1e5+7;
int n,m;
int a[N];
void dfs(int x,int idx)
{
	if(idx==m)//限定!!!
	{
		for(int i=1;i<=idx;i++)
		cout<<a[i]<<" ";
		cout<<"\n";
	}
	
	for(int i=x;i<=n;i++)
	{
		a[idx+1]=i;
		dfs(i+1,idx+1);
	}
	return ;
}
int main()
{
	
	cin>>n>>m;
	dfs(1,0);
	return 0;
 } 

非递归:组合数

点击查看代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef pair<int,int> pll;
typedef long long ll;
const int N=1e5+7;
int n,m;
int a[N];
int cc[50][50];
int b[50000][500];
int main()
{
	
	cin>>n>>m;
	cc[0][0]=1;
	for(int i=1;i<=n;i++)
	{
		cc[i][0]=1;
		for(int j=1;j<=i;j++)
		{
			cc[i][j]=cc[i-1][j]+cc[i-1][j-1];
	//		cout<<cc[i][j]<<" ";
		}
	//	cout<<endl;
	}
	int sum;
	int w=cc[n][m];
//	cout<<w<<endl;
	for(int i=1;i<=m;i++)
	{
		int j=1;
		int q=i;
		int x=0;
		while(j<=w)
		{
			if(n-q<m-i)	q=b[j][i-1]+1;
			if(n-i-x>0)
			sum=cc[n-q][m-i];
			else  sum=1000;
			while(sum--)
			{
				b[j++][i]=q;
			}
//			if(i!=1)
//			q=b[j][i-1]+1;
//			else 
			q++;
		//	x++;
		}
	}
	for(int i=1;i<=w;i++)
	{
		for(int j=1;j<=m;j++)
		cout<<b[i][j]<<" ";
		cout<<endl;
	}
	return 0;
 } 
posted @ 2023-02-16 18:41  xxj112  阅读(51)  评论(0)    收藏  举报