描述:
找出从自然数1、2、… 、n(0 < n < 10)中任取r(0 < r <=n)个数的所有组合。
输入:
输入n、r。
输出:
按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
样例输入:
5 3
样例输出:
543
542
541
532
531
521
432
431
421
321
这个题目其实在之前的《算法竞赛入门》暴力求解法的全排列中已经提过了。
唯一的区别就是全排列不是按照本题要求的从大到小的顺序排列的,所以需要一个判断条件,已经放进数组A的数是否比即将插入A数组的数大
文章链接:
http://blog.csdn.net/karry_zzj/article/details/65710394
#include<cstdio>
#include<cstring>
using namespace std;
int n,r;
int A[1000],vis[1000];
void dfs(int *A,int cur)
{
if(cur==r)
{
for(int i=0; i<r; i++)
{
printf("%d",A[i]);
}
printf("\n");
}
for(int i=n; i>0; i--)
{
int ok = 1;
for(int j=0; j<cur; j++)
if(vis[i] || A[j]<i)
{
ok = 0;
break;
}
if(ok)
{
vis[i] = 1;
A[cur] = i;
dfs(A,cur+1);
vis[i] = 0;//清楚标志
}
}
}
int main()
{
scanf("%d%d",&n,&r);
memset(vis,0,sizeof(vis));
dfs(A,0);
return 0;
}
这里我使用了vis数组来判断是否使用过某个数。注意要清除标志