帶條件的排列組合演算法分析

2021-08-30 09:20:16 字數 825 閱讀 1857

演算法說明:

用1、2、2、3、4、5這六個數字列印出所有不同的排列,如:512234、412345等。要求:"4"不能在第三位,"3"與"5"不能相連

演算法**:

public class permutationalgo 

/*** @param elestr - 待分配字元組成的串

* @param rststr - 已分配字元組成的串

*/public void depthsearch(string elestr, string rststr)

for (int i = 0; i < elestr.length(); i++)

} public static void main(string args)

}

演算法分析:

因為是排列組合所以用遞迴

因為有條件所以遞迴時要剪枝

可用公式算出合法的排列數,以驗證結果:

( a6

6 -

a55 - 2·

a55 + 2·

c13·

a33)/2 = 198

第一項為全排列的數量

第二項為"4"在第三位的數量

第三項為"3"與"5"相連的數量

第四項加回二三項重複減去的數量

因為排列中有兩個相同的字元"2",且在各個位置出現的概率相同,故需將整個結果除2修正

此題本身並不難,因為在論壇上看到很多人對排列組合的演算法缺乏一般的解題思路,因而貼出,希望能給大家帶來幫助。

排列組合演算法

在開發的過程中很難免會到排列組合,剛開始通過for迴圈來搞定。但是對於工作了近五年的我而已,不能像 新人那樣做了。如果所要組合的集合大於40,你不可能寫40個for迴圈吧!這裡使用了數學的演算法,到底是啥演算法,高人也沒說!不過我把它的思想提公升了一下。如下 ifndef combination h...

排列組合演算法

1.排列演算法 include define max num 100 void print int n,int num void swap int a,int b int arrange int i,int n,int num i return count int combination int u...

排列組合演算法

組合演算法的思路是開乙個陣列,其下標表示1到m個數,陣列元素的值為1表示其下標代表的數被選中,為0則沒選中。初始化,將陣列前n個元素置1,表示第乙個組合為前n個數。從左到右掃瞄陣列元素值的 10 組合,找到第乙個 10 組合後將其變為 01 組合,同時將其左邊的所有 1 全部移動到陣列的最左端。當第...