C r and n(组合数)
找出n个数的r个数的组合,如下形式:
输入:n,r分别为 5, 3
输出: 5 4 3
5 4 2
5 4 1
5 3 2
5 3 1
5 2 1
4 3 2
4 3 1
4 2 1
3 2 1
分析:我的思路如下,用增量构造法,生成一个子集,用if语句判断是否符合r个数,若为真,则输出结果。按题目要求,子集要倒序输出,所以要将模型的for循环改为由n-1到0,输出时再统一加上1。
#include<cstdio> #include<cstdlib> using namespace std; void sub(int n,int *a,int cur,int r) { if(cur==r){ for(int i=0;i<cur;i++)printf("%d ",a[i]+1); putchar('\n'); return; } int s=cur?a[cur-1]-1:n-1; for(int i=s;i>=0;i--){ a[cur]=i; sub(n,a,cur+1,r); } } int main() { int n,r,a[101]; scanf("%d%d",&n,&r); sub(n,a,0,r); return 0; }