一般组合

来源:互联网 发布:java服务器端环境搭建 编辑:程序博客网 时间:2024/05/01 00:40

输入n 个数,从中选出m 个数可构成集合,输出所有这样的集合。


思路:采用递归(回溯)实现。使用了中间变量p,保证了每次选的数字在num 中的下标是递增的,所以也就不需要进行标记,共C(n, m)种组合。


#include <cstdio>#define N 10using namespace std;int n, m; //从n个数中选出m个构成组合int rcd[N]; //记录选出的数int num[N]; //存放输入的n个数void select(int l, int p){int i;if (l == m)  //若选出了m个数, 则打印返回 {for (i=0; i<m; i++)printf("%d ", rcd[i]);//printf("\nreturn\n\n");printf("\n");return ;}for (i=p; i<n; i++){//printf("p=%d,i=%d\n",p,i);rcd[l] = num[i];//printf("l=%d,rcd[%d]=num[%d]=%d\n\n",l,l,i,rcd[l]);select(l+1, i+1);}}int main(){while(scanf("%d%d", &n, &m)!=EOF){for (int i=0; i<n; i++)scanf("%d", &num[i]);select(0, 0);}return 0;}


下图是我自己理解递归的时候画的:



0 0
原创粉丝点击