题解:递归方法,在上一题的题解上面加一个限定就行了
点击查看代码
#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;
}