在此介紹二進位制轉化法,即。將每乙個組合與乙個二進位制數相應起來,列舉二進位制的同一時候,列舉每乙個組合。
如字串:abcde,則有
00000---------null
00001---------a
00010 --------b
00011---------ab
00100---------c
… …11111--------abcde
給出程式例如以下所看到的:
#include #include void printcombination(char* str, int i);
void combination(char* str)
delete arr;
}//從n中選m個數進行組合
/**************************************
a. 首先從n個數中選取編號最大的數,然後在剩下的n-1個數裡面選取m-1個數,
直到從n-(m-1)個數中選取個數為止。
b. 從n個數中選取編號次小的乙個數,繼續執行步,直到當前可選編號最大的數為m。
******************************************/ void printcombination(char* str, int len, int m, int* arr, const int m) else printf("\n"); } } } int main()
首先,初始化乙個n個元素的陣列(所有由0,1組成),將前m個初始化為1,後面的為0。這時候就能夠輸出第乙個組合了。為1的元素的下標所相應的數。
演算法開始:從前往後找,找到第乙個10組合,將其反轉成01,然後將其前面的所有1,所有往左邊推,即保證其前面的1都在最左邊。然後就能夠依照這個01序列來輸出乙個組合結果了。
而假設找不到10組合,就表示說所有情況都輸出了,為什麼?你想。(以n=5,m=3為例)一開始是11100,最後就是00111。已經沒有10組合了。
這樣的將問題轉換為01序列(也就是真假序列)的想法值得我們考慮和借鑑。
比如求5中選3的組合:
1 1 1 0 0 //1,2,3
1 1 0 1 0 //1,2,4
1 0 1 1 0 //1,3,4
0 1 1 1 0 //2,3,4
1 1 0 0 1 //1,2,5
1 0 1 0 1 //1,3,5
0 1 1 0 1 //2,3,5
1 0 0 1 1 //1,4,5
0 1 0 1 1 //2,4,5
0 0 1 1 1 //3,4,5
實現**例如以下:
#include #include #include int l=0;
//function definition
void composition(const char ,int,int);
void printcompostion(const char,const bool,int);
//function implementation
void printcompostion(const char source,const bool comp,int n)
void printintarray(int target,int length)
if(i == first) //進行到最前面了
}}
#include #include #include using namespace std;
//反轉陣列
void reverse(char* str, int first, int last)
}//列印陣列
void printfstring(char* str)
} //從後面找到第乙個大於str[i]的數字
while(str[j] < str[i])
//交換
char ch = str[i];
str[i] = str[j];
str[j] = ch;
//翻轉j之後的陣列
reverse(str, ii, len-1);
return true; }
int main()
return 0;
}
參見:
排列組合總結
在此介紹二進位制轉化法,即,將每乙個組合與乙個二進位制數相應起來,列舉二進位制的同一時候,列舉每乙個組合。如字串 abcde,則有 00000 null 00001 a 00010 b 00011 ab 00100 c 11111 abcde 給出程式例如以下所看到的 include include...
排列組合問題總結
根本思想還是組合數學的加法原則,將乙個狀態分成幾個不相交的狀態,然後用加法原則加起來即可 如果 n m c n 1,m 1 c n 1,m 1 c n 1,m 1 否則 n000 分析 使用插板法 n個球中間有n 1個間隙,現在要分成m個盒子,而且不能有空箱子,所以只要在n 1個間隙選出m 1個間隙...
演算法總結 排列組合
46 全排列 關鍵點 使用used記錄已使用的用數字 class solution def permute self,nums list int list list int self.res self.used false len nums self.generatearrange nums,0,r...