明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

處理排列組合問(wèn)題的通用算法

[摘要]很多網(wǎng)友發(fā)貼詢問(wèn)諸如:八皇后問(wèn)題、彩票問(wèn)題(從m中數(shù)中選擇n(m>=n)的組合)等,其實(shí)這都可歸結(jié)為排列組合的問(wèn)題。解決這類(lèi)問(wèn)題,用for循環(huán)嵌套是不現(xiàn)實(shí)的(只能對(duì)指定的m、n編程,而且程序看...
很多網(wǎng)友發(fā)貼詢問(wèn)諸如:八皇后問(wèn)題、彩票問(wèn)題(從m中數(shù)中選擇n(m>=n)的組合)等,其實(shí)這都可歸結(jié)為排列組合的問(wèn)題。解決這類(lèi)問(wèn)題,用for循環(huán)嵌套是不現(xiàn)實(shí)的(只能對(duì)指定的m、n編程,而且程序看上去異常繁瑣),較好的方法是回朔法。下面給出這類(lèi)問(wèn)題的一般算法的c/c++描述:

int combine(int a[],int sub){
//a[1..?]表示候選集,sub表示一個(gè)排列(組合)的元素個(gè)數(shù)
{
   int total=sizeof(a);
   int order[sub+1];
   int count=0;//符合條件的排列(組合)的個(gè)數(shù)
   order[0]=-1;
   for(int i=1;i<=sub;i++)
      order[i]=i;
   int k=sub;
   bool flag=true;
   while(order[0]!=-1){
      if(flag){
         for(i=1;i<=sub;i++)//輸出符合要求的組合
            printf("%d ",a[order[i]]);
         printf("\n");
         count++;
         flag=false;
      }
      order[k]++;
      if(order[k]==total+1){
         order[k--]=0;
         continue;
      }   
   ...
      //在此加入order[k]的限制條件
      //如果條件滿足,則往下執(zhí)行
      //否則continue;
      if(k<sub){
         order[++k]=order[k-1];
         continue;
      }
      if(k==sub)
         flag=true;
   }
   return count;
}