天天看點

java中的排列組合

1

<code>使用之前需要聲明一個combine的對象,調用startcombile方法,可傳回想要的組合數或者個數,參數介紹很重要</code>

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

<code>&lt;br&gt;</code>

<code>public</code> <code>class</code> <code>combine {</code>

<code>    </code><code>private</code>

<code>object[] oldarr;</code>

<code>object[] newarr;</code>

<code>list&lt;object[]&gt; list=</code><code>new</code>

<code>arraylist&lt;object[]&gt;();</code>

<code>int</code> <code>needlength;</code>

<code>int</code> <code>count;</code>

<code>boolean</code> <code>flag;</code>

<code>    </code> 

<code>    </code><code>/**</code>

<code>     </code><code>* 例如我要在5個數中取個,那麼arr就是包含這五個的數組,needlength就是3</code>

<code>     </code><code>* @param arr  要進行的數組</code>

<code>     </code><code>* @param needlength    需要的個數</code>

<code>     </code><code>* @param flag  true代表傳回一個list,list裡包含了所有的組合情況;false代表傳回一個數字,這個數字就是所有組合的個數</code>

<code>     </code><code>* @return</code>

<code>     </code><code>* 此方法為運作入口</code>

<code>     </code><code>*/</code>

<code>    </code><code>public</code>

<code>object startcombile(object[] arr,</code><code>int</code>

<code>needlength,</code><code>boolean</code>

<code>flag){</code>

<code>        </code><code>this</code><code>.needlength=needlength;</code>

<code>        </code><code>this</code><code>.oldarr=arr;</code>

<code>        </code><code>this</code><code>.newarr=</code><code>new</code>

<code>object[needlength];</code>

<code>        </code><code>this</code><code>.flag=flag;</code>

<code>        </code><code>getcombineresult(</code><code>this</code><code>.oldarr.length,needlength);</code>

<code>        </code><code>if</code><code>(flag){</code>

<code>            </code><code>return</code>

<code>list;</code>

<code>        </code><code>}</code><code>else</code><code>{</code>

<code>count;</code>

<code>        </code><code>}</code>

<code>    </code><code>}</code>

<code>void</code> <code>getcombineresult(</code><code>int</code>

<code>sum,</code><code>int</code> <code>length){</code>

<code>        </code><code>//5中3個 sum代表5,length代表3,因為遞歸,到最後肯定是n個裡面取1個,當取1個的時候一層遞歸就結束了,會傳回到上一層繼續遞歸</code>

<code>        </code><code>if</code><code>(length&gt;</code><code>0</code><code>){</code>

<code>            </code><code>for</code><code>(</code><code>int</code>

<code>i=oldarr.length-sum;i&lt;oldarr.length;i++){</code>

<code>                </code><code>newarr[needlength-length]=oldarr[i];</code>

<code>                </code><code>if</code><code>(length==</code><code>1</code><code>){</code>

<code>                    </code><code>if</code><code>(flag){</code>

<code>                        </code><code>object[] myarr=</code><code>new</code>

<code>                        </code><code>for</code><code>(</code><code>int</code>

<code>j=</code><code>0</code><code>;j&lt;newarr.length;j++){</code>

<code>                            </code><code>myarr[j]=newarr[j];</code>

<code>                        </code><code>}</code>

<code>                        </code><code>list.add(myarr);</code>

<code>                    </code><code>}</code><code>else</code><code>{</code>

<code>                        </code><code>count++;</code>

<code>                    </code><code>}</code>

<code>                </code><code>}</code>

<code>                </code><code>sum--;</code>

<code>                </code><code>getcombineresult(sum,length-</code><code>1</code><code>);</code>

<code>            </code><code>}</code>

<code>}</code>