此算法通常用于排列,一个递归就可以实现。
需要的变量如下:
int n,k; //n为原数组元素个数,k为选取元素个数
int x[20]; //原数组
int flag[20]; //原数组标志位,为1则表示此位置元素已被选取
int c[20]; //保存已被选取的元素下标
递归搜寻子序列的函数如下:
void arr(int index)
{
if(index==k-1) //如果已经找到了k个数
{
save(c); //保存c数组已经找的子序列,这部分自己定义
}
for(int i=c[index];i<n;i++) //以c[index]为起始点,目的是为了接下来找的数的下标要大于之前的数的下标,防止子序列重复
{
if(flag[i]!=1) //此元素未被选中
{
flag[i]=1; //标志位至1
c[index+1]=i; //下标保存在c数组
arr(index+1); //以当前index+1位基准执行递归
flag[i]=0; //标志位至0,为什么这么做看下回溯法就知道了
}
}
}
调用此函数的时候要注意,使用ar(-1)即可找到所有的子序列,必须以-1位基准。
int main()
{
cin>>n>>k;
int i;
for(i=0;i<n;i++)
cin>>x[i];
arr(-1);
return 0;
}