演算法說明:
用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 全部移動到陣列的最左端。當第...