算法——递归思想解决排列组合问题

原文地址为: 算法——递归思想解决排列组合问题

直接上代码

void AString_m(char *str,char*pBegin)
{//扩展以后对数组也适用。也可以写成这种形式AString(char *str,int i,int n);
      if(!str || !pBegin) return;
      if(*pBegin=='\0')     cout<<str<<endl;
      else
      {  for(char *temp=pBegin;*temp!='\0';temp++)
            {  char t=*pBegin;*pBegin=*temp;*temp=t;
                  AString_m(str,pBegin+1);
                  t=*pBegin;*pBegin=*temp;*temp=t;
            }
      }
}
void AString( char*str)//提供的公共接口函数
{AString_m(str,str); }
void CString_m(char * pStr,int m,vector<char> & result)
{//从一个字符串中选取m个字符
      if(pStr==NULL)//字符串为空情形
            return ;
      if(*pStr=='\0' && m!=0)//字符串中不够m个字符啦
            return ;
      if(m==0)
      { for(int  i=0;i<result.size();i++)
                  cout<<result[i];
            cout<<endl;
            return;
      }
      result.push_back(*pStr);
      CString_m(pStr+1,m-1,result);
      result.pop_back();
      CString_m(pStr+1,m,result);
}
void CString(char *pStr)
{//求一个字符串中字符的全排列
      if(pStr==NULL || *pStr=='\0') return;
      int len=strlen(pStr);    vector<char> re;
      for(int i=1;i<=len;i++)
      { re.clear();
            CString_m(pStr,i,re);
      }
}
//排列组合类似实际问题:运动员打靶十次,问共打中90环有多少种可能
void ShootProblem_m(int number,int sum,vector<int> & result,int *total)
{//打靶number次,共打中sum环
      if(number<=0 || number*10<sum )  return ;
      if(number==1)
      { if(sum<=10 && sum>=0)
            {  for(int i=0;i<result.size();i++)
                        cout<<result[i]<<" ";
                  cout<<sum<<endl;
                  (*total)++;
                  return;
            }   
           else  
                 return;
      }
      for(int i=0;i<=10;i++)
      {
            result.push_back(i);
            ShootProblem_m(number-1,sum-i,result,total);
            result.pop_back();
      }
}
void ShootProblem(int number,int sum)
{//提供的公共接口函数
      vector<int >re;
      int a=0;
      ShootProblem_m(number,sum,re,&a);
      cout<<"总共可能性有"<<a<<"种"<<endl;
}


转载请注明本文地址: 算法——递归思想解决排列组合问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值