前言
排列组合问题是NOIP竞赛中非常常见且难度较大的一类题目,主要有两类:组合问题、全排列问题。这里我们先讨论组合问题,全排列问题后面再讨论。
问题
数组A的长度为N(0<N<=15),从这N个数中取出M个数。问:共有几种取法?并列出每种取法取出的数据组合。注意:我们这里不讨论数组中重复数据的问题(即:一个组合中可以有重复的数据)。
例如:int A[4]={1,2,3,4}; 从4个元素中取出3个元素的组合,共有4种
4 3 2
4 3 1
4 2 1
3 2 1
注意:N应该有取值范围的限制,如果数过大,则算法时间复杂度太高,程序运行时间会过长。通常限制在15以内。
分析
事实上,组合问题的程序框架十分固定:循环 + 递归。你也许难以理解(主要是递归这东西不好理解),但可以先记住,先使用再说。
总体原理:数组中的每一个元素都要作为最后一个元素(即作为定的一个元素)【所以用一层for循环】,前面所有的元素中选择m-1个元素【递归】
参考代码
#include<iostream>
#include<cstring>
using namespace std;
#define MAX 15
int A[MAX],B[MAX];
int m,r;
void print()
{
for(int i=0;i<r;i&