回溯遞迴 自然數的拆分

2021-10-01 09:57:43 字數 1565 閱讀 3233

題目 -------自然數的拆分:

任何乙個大於1的自然數n,總可以拆分成若干個小於n的自然數之和。 當n=7共14種拆分方法:

7=1+1+1+1+1+1+1

7=1+1+1+1+1+2

7=1+1+1+1+3

7=1+1+1+2+2

7=1+1+1+4

7=1+1+2+3

7=1+1+5

7=1+2+2+2

7=1+2+4

7=1+3+3

7=1+6

7=2+2+3

7=2+5

7=3+4

輸入格式:

輸入n, 1輸入樣例:

在這裡給出一組輸入。例如:

7輸出樣例:

7=1+1+1+1+1+1+1

7=1+1+1+1+1+2

7=1+1+1+1+3

7=1+1+1+2+2

7=1+1+1+4

7=1+1+2+3

7=1+1+5

7=1+2+2+2

7=1+2+4

7=1+3+3

7=1+6

7=2+2+3

7=2+5

7=3+4

****現的函式及陣列的作用:

g陣列的作用是儲存拆出來的數,並在最後輸出成果

s()函式的作用是判斷能不能繼續拆(遞迴)

dfs()遞迴函式,負責"拆"n

解題思路:

一開始分析,第乙個加數總是小於n/2,就想到n是由1到n/2拆(也就是乙個dfs()),然後n-x(x<=n/2)繼續拆(遞迴),直到不能裂開。

不能拆的情況:j - (m-j)>1 特殊情況:j = 1, m-j = 2 (m是形參,一開始初始化為n)

(ps:j 和 m - j 的含義:例如 3 會拆成1+2,j就是1,m-j就是2)

**:

#include

using

namespace std;

#define n 9999

int n;

int b[n]

;int g[n]

;bools(

int i ,

int j)

void

dfs(

int i,

int m,

int k)

else

cout<"=";

for(

int p =

0;g[p]!=0

;p++

) cout

; g[k+1]

=0;}

}int

main()

感想:

一點點想出來的感覺真好,明白是怎麼拆的->懂得怎麼拆->最後,懂得怎麼存數字並按照格式輸出。

我覺得這道題難就難在怎麼輸出

最後遞迴我終於懂你一點點了。。。hhhhhh~~

遞迴 拆分自然數

題目描述 天下熙熙,皆為利來 天下攘攘,皆為利往 監獄裡的暗勢力劃分地盤的目的無非是為了獲取利益,他們分配利益的方式是基於這樣乙個準則 設總利益為自然數 則任何乙個大於1的n,總可以拆分成若干個小於n的自然數之和,求出n的所有拆分後選擇最合適的一種進行分配,例如當n 3時,有兩種劃分,即3 1 2和...

遞迴 自然數的拆分問題

2044 回溯 自然數的拆分問題 時間限制 1 sec 記憶體限制 128 mb 提交 狀態 題目描述 輸入自然數n,拆分成由若干數相加的形式,參與加法運算的數可以重複。輸入待拆分的自然數n。輸出若干數的加法式子。樣例輸入 copy 7樣例輸出 copy 1 61 1 5 1 1 1 4 1 1 1...

自然數拆分

描述 description 輸入自然數n,然後將其拆分成由若干數相加的形式,參與加法運算的數可以重複。輸入格式 inputformat 輸入只有乙個整數n,表示待拆分的自然數n。n 80 輸出格式 outputformat 輸出乙個數,即所有方案數 樣例輸入 sampleinput 複製資料 7 ...