列舉組合的所有情況(多層巢狀for迴圈與遞迴)

2021-08-31 07:29:31 字數 1338 閱讀 6101

從n個元素中一次抽取m個元素,則共有c(n,m)種可能的情況。那麼怎樣將組合的所有可能情況一一枚舉出來呢?

以1至10共10個數字為例

int array=new int[10];

for(int i=0;ic(10,1),即從10個數字中抽取1個數字

我們可以用for迴圈將其一一枚舉出來

for(int i=0;i所有可能情況為:

c(10,2),即從10個數字中抽取2個數字

此時用兩層for迴圈即可將其一一枚舉出來

for(int i=0;i所有可能情況為:

通過以上兩個例子就會知道當列舉兩個數字時,列出的第二個數字是在前乙個數字的基礎上往後尋找的;那麼列舉三個數字時,列出的第三個數字是在前二個數字的基礎上往後尋找的。所以從n個元素中列舉出m個元素,列舉出的第m個元素是在前m-1個元素的基礎上往後尋找到的,那麼要確定前m-1個元素就要確定前m-2個元素,就要確定前m-3個元素……確定前2個元素,確定前1個元素。

所以多層巢狀迴圈可以幫助我們解決這個問題,列舉出m個元素就有m層迴圈,每一層迴圈的初始條件是在前一迴圈初始條件的基礎上+1。

c(10,5),即從10個數字中抽取5個數字

此時要用到5層for迴圈,**特別繁雜

int count=0;

for(int i=0;i所有可能情況為:

因結果較長,未擷取所有情況。

如果要列舉出的元素個數特別大,那麼多層巢狀迴圈顯然不適合解決該類問題。而遞迴能夠實現多層巢狀迴圈且**足夠簡潔。

**於下

public class enumerate ;

int temp=new int[5];//記錄依次抽取到的5個數字的下標

int count=0;//統計組合的情況總數

public void method(int i,int j) //結束enumerate類

執行結果為

因結果較長,未擷取所有情況。

「列舉」真的要嘗試所有情況嗎?

基於逐個嘗試答案的一種問題求解策略 列舉雖然是一種逐個嘗試的問題求解策略,但是也是可以進行優化的,有些可能的答案或者可能的猜測在進行稍加判斷後,就可以直接排除掉,從而避免代入問題進行求解,進一步節省時間。具體的優化方法,往往要根據具體問題具體分析,沒有統一的標準。問題描述 形如a3 b3 c 3 d...

回文數的判斷(考慮所有情況)

如下所有情況 1.當數值為負數時,返回false 即負數不是回文數 2.當數值最後乙個數為0並且這個數值本身不是0時,返回false 3.如果是使用數值反轉比較的話,需要考慮溢位的情況在此,我使用的是數值反轉的思想,不過鑑於資料溢位的情況,在這裡並不是反轉整個數值,而是將數值進行折半反轉賦值給乙個數...

C 排列組合(從N個數中選擇M個數的所有情況)

待選擇的數存放在in矩陣中,矩陣的大小為n,從中選出target m個數,給出所有可能情況。思路 in矩陣存放的數為 m 2,n 4 下標0 123元素 123定義乙個數i,從0 2 n,其二進位制位數n位,分別表示是否選擇第n位,乙個都不選 0000 選擇下標為0的 1000 選擇下標為3的 00...