求全组合

来源:互联网 发布:linux配置代理服务器 编辑:程序博客网 时间:2024/05/28 05:15

算法转载自:http://blog.csdn.net/sagadean/article/details/8030541

我自己修改bug,又添加一些注释

#include <iostream>#include <stdlib.h>using namespace std;/* *  array是要排列的数组 *  isPrint是与array等长的,将要输出的数字标记的数组 *  index和right是array的两个下表,index在左,right在右 *  sum是当前组合的数字数目 *  该函数是从array的index到right之间选出sum个数字的组合,并在与之对应的 *  isPrint数组中标记出来。对于index所指向的数字,可选或不选,就像背包算法一样,但总是将选出来的数量 *  限制在sum。 */void Print(int array[],int isPrint[],int index,int right,int sum){    if(index>right && sum)        return;    if(sum==0)    {        for(int i=0;i<=right;i++)        {            if(isPrint[i]==1)                cout<<array[i];        }        cout<<endl;        return;    }    isPrint[index]=1;    Print(array,isPrint,index+1,right,sum-1);    isPrint[index]=0;    Print(array,isPrint,index+1,right,sum);}void PrintAll(int array[],int length){    int *isPrint=new int[length]();    for(int i=1;i<=length;i++)    {        Print(array,isPrint,0,length-1,i);    }}int main(){    int array[4]={1,2,3,4};    PrintAll(array,4);    system("pause");}



0 0