遞迴和遞推

2021-10-19 10:00:22 字數 3024 閱讀 2625

從 1~n 這 n 個整數中隨機選取任意多個,輸出所有可能的選擇方案。

輸入格式

輸入乙個整數n。

輸出格式

每行輸出一種方案。

同一行內的數必須公升序排列,相鄰兩個數用恰好1個空格隔開。

對於沒有選任何數的方案,輸出空行。

本題有自定義校驗器(spj),各行(不同方案)之間的順序任意。

資料範圍

1≤n≤15

輸入樣例:

輸出樣例:

3

22 3

11 3

1 21 2 3

對於每一步遞迴,可以不選擇當前數n直接進入下一步,也可以選擇當前數n再進入下一步(記得還原現場)

#include

using

namespace std;

const

int n=20;

int res[n]

;//存答案的陣列

int n,r;

void

dfs(

int p)

dfs(p+1)

;//直接進入下一步遞迴

res[

++r]

=p;//選擇當前數再進入下一步遞迴

dfs(p+1)

; r--

;//還原現場

return

;//return不能掉

}int

main()

從 1~n 這 n 個整數中隨機選出 m 個,輸出所有可能的選擇方案。

輸入格式

兩個整數 n,m ,在同一行用空格隔開。

輸出格式

按照從小到大的順序輸出所有方案,每行1個。

首先,同一行內的數公升序排列,相鄰兩個數用乙個空格隔開。

其次,對於兩個不同的行,對應下標的數一一比較,字典序較小的排在前面(例如1 3 5 7排在1 3 6 8前面)。

資料範圍

n>0 ,

0≤m≤n ,

n+(n−m)≤25

輸入樣例:

5 3

輸出樣例:

1 2 3

1 2 4

1 2 5

1 3 4

1 3 5

1 4 5

2 3 4

2 3 5

2 4 5

3 4 5

給指數型列舉加限制條件就是組合型列舉了

#include

#include

using

namespace std;

const

int n=30;

int res[n]

;//存答案的陣列

queue<

int> ans[

100000];

int n,r,m,q;

void

dfs(

int p)

if(p>n)

return

;dfs

(p+1);

//直接進入下一步遞迴

res[

++r]

=p;//選擇當前數再進入下一步遞迴

dfs(p+1)

; r--

;//還原現場

return

;//return不能掉

}int

main()

cout<}return0;

}

把 1~n 這 n 個整數排成一行後隨機打亂順序,輸出所有可能的次序。

輸入格式

乙個整數n。

輸出格式

按照從小到大的順序輸出所有方案,每行1個。

首先,同一行相鄰兩個數用乙個空格隔開。

其次,對於兩個不同的行,對應下標的數一一比較,字典序較小的排在前面。

資料範圍

1≤n≤9

輸入樣例:

輸出樣例:

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

#include

using

namespace std;

const

int n=15;

int n;

int res[n]

,r,visit[n]

;//res[n]是存答案的陣列,visit[n]是標記陣列

void

dfs(

int p)

for(

int i=

1;i<=n;i++)}

return;}

intmain()

遞迴和遞推

遞迴的概念 乙個函式 過程 概念或資料結構,如果在其定義或說明內部直接或間接地出現有其本身的引用,或者是為了描述問題的某一狀態,必須用到它的上一狀態,而描述上一狀態,又必須用到它的上一狀態 這種用自己來定義的方法,稱之為遞迴或者遞迴定義。在程式設計中,過程或函式直接或者間接呼叫自己,就稱為遞迴呼叫 ...

遞推和遞迴

貪心的思想可以用一句話來歸納,每步取優 很好理解,假設你的程式要走i 1 n共n步,那麼保證你的第i步走出的是當前這一步的最優值。這樣的解題方法叫做貪心演算法。可見貪心演算法並不是乙個全面的列舉方法而是若干結果中的一種,僅僅一種而已。但這種演算法是不是最優解它就不能完全保證了。一般每個可以使用遞迴演...

遞推和遞迴

一 遞推演算法基本思想 遞推演算法是一種理性思維模式的代表,其根據已有的資料和關係,逐步推導而得到結果。遞推演算法的執行過程如下 1 根據已有的 結果和關係,求解中間結果 2 判定是否達到要求,如果沒有達到,則繼續根據已知結果和關係求解中間結果 如果滿足要求,則表示尋找到乙個正確的答案。遞推演算法往...