一級講解 拆分自然數 經典DFS例題

2021-10-12 22:07:26 字數 2066 閱讀 3735

任何乙個大於1的自然數n,總可以拆分成若干個小於n的自然數之和。

6
[situation 1]:1 1 1 1 1 1

[situation 2]:1 1 1 1 2

[situation 3]:1 1 1 3

[situation 4]:1 1 2 2

[situation 5]:1 1 4

[situation 6]:1 2 3

[situation 7]:1 5

[situation 8]:2 2 2

[situation 9]:2 4

[situation 10]:3 3

the total number of disassemble is 10

這道題目稍微有一點點高階,在讀完題目,尤其是看完示例後,你會發現這道題目與之前題目最大的不同點一在於答案長度的不確定,二在於可以重複使用自然數(元素)。

但其實這兩個問題只要稍微修改一下dfs中的判斷條件就好了~

同樣的,我們拿出我總結的模板來套一套

dfs模板

int dfs ( int n )

}

①很明顯這裡的所有可能就是:從1、2、3、…、一直到newn可能很多人會很疑問,到底什麼是newn呢?

別急,等我慢慢來解釋。

也許你一下子不知道拆分6的情況有多少種,那也許5的難度會更低一點,同理,4的難度會比5低,3的難度會比4低,那我們這裡就從最小自然數(除0外)的1開始遍歷,

每次找到符合條件的數就將其記錄入「答案佇列」然後將

n-符合條件的數
並更新為newn。這樣子每一輪我們符合條件的數都要符合

i<=newn
至於初始條件,我們選擇

i=ans[k-1]
這是因為我們每次選數字都要大於或等於上一次選的數字,那麼這麼寫後自然而然就要關注臨界情況,即ans[1]的情況,需要預先賦值為1.

②是否符合判斷條件:

這裡就要解決如何可以重複使用自然數(元素)。

很簡單,不處理就好了。

???也許你會有點懵,但回想一下,前面幾道題目我們是不是都用bool陣列來mark一下防止重複使用,這裡題目沒有要求,自然不處理就好了。

③儲存結果:

很經典的兩部分可以去掉第二部分,只留下一部分將這個數收入「答案佇列」中等待「全員到齊」輸出即可

④符合輸出最終解/邊界條件:

解決第二個問題答案長度的不確定,之前我們都是等待「全員到齊」輸出即可,但這裡怎麼判斷全員到齊了呢?那就是newn=0咯

⑤輸出操作:

很經典的單獨定義乙個輸出函式以專門的格式輸出

⑥回溯復原:

其實我第一次寫的時候因為兩個細節錯了,這裡貼上我的錯誤**,並分析錯誤原因。

dfs解決自然數拆分

給定乙個自然數n,要求把n拆分成若干個正整數相加的形式,參與加法運算的數可以重複。n 30。輸入格式 乙個整數n。輸出格式 輸出乙個數,即所有方案數 樣例輸入 7樣例輸出 14因為n比較小,所以我用的是一種比較耗時的簡單的思路,dfs解決。首先,思路很簡單,比如7,可以分成1 6,那麼我們考慮到接下...

自然數拆分(整數劃分一)

time limit 1 ms memory limit 128 mb difficulty 2 輸入自然數n,然後將其拆分成由若干數相加的形式,參與加法運算的數可以重複。輸入只有乙個整數n,表示待拆分的自然數n。n 80 輸出乙個數,即所有方案數 7 14解釋 輸入7,則7拆分的結果是 7 1 6...

2019 7 25 搜尋練習一 自然數的拆分

洛谷p2404 自然數的拆分 2019.7.25 題目描述 任何乙個大於1的自然數n,總可以拆分成若干個小於n的自然數之和。現在給你乙個自然數n,要求你求出n的拆分成一些數字的和。每個拆分後的序列中的數字從小到大排序。然後你需要輸出這些序列,其中字典序小的序列需要優先輸出。輸入格式 輸入 待拆分的自...