排列組合總結

2021-09-07 12:50:50 字數 2265 閱讀 8421

在此介紹二進位制轉化法,即,將每乙個組合與乙個二進位制數相應起來,列舉二進位制的同一時候,列舉每乙個組合。

如字串: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...