//
src是源数据集合,currentIndex是在源集合里的当前下标,length为源集合的大小,dest是结果集合,num是结果集合的元素个数,初始化时,结果集合要和源集合的个数相等.
void
match(
int
*
src,
int
currentIndex,
int
length,
int
*
dest,
int
num)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if(currentIndex == length)
return ;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
dest[num++] = src[currentIndex++];//采用当前元素
for(int i =0 ; i < num; i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
cout << dest[i]<<" ";
}
cout << endl;
match(src,currentIndex,length,dest,num);//选用当前元素进行递归
match(src,currentIndex,length,dest,num-1);//去除当前元素再进行递归
}
int src[] = {1,2,3};
int* dest = new int[3];打印的结果是:
1
1 2
1 2 3
1 3
2
2 3
3
所以这个算法可以求背包问,加和问题等。凡是与子集合相关的问题,全部可以用这个方法解决。