dfs解決自然數拆分

2021-10-07 01:30:37 字數 733 閱讀 6723

給定乙個自然數n,要求把n拆分成若干個正整數相加的形式,參與加法運算的數可以重複。n<=30。

輸入格式

乙個整數n。

輸出格式

輸出乙個數,即所有方案數

樣例輸入:

7樣例輸出:

14因為n比較小,所以我用的是一種比較耗時的簡單的思路,dfs解決。

首先,思路很簡單,比如7,可以分成1+6,那麼我們考慮到接下來的問題就是考慮把6怎麼分。所以很明顯遞迴dfs是可以解決的,遞迴的變數就是分完之後剩下的數x,然後遞迴過程就是在小於等於x的數中,選擇乙個數進行下一步的遞迴。

但是比如說7,我們分成1+2+4,4接著往下分,分成了1+3,那麼7=1+2+1+3,但是我們遍歷第乙個數字是2的情況時,我們也是存在分出2個1和1個3的情況,那麼就重複計算了。所以我們在遍歷時的引數可以加乙個前面乙個數是多少假設是y,在遍歷時,我們就可以在y和x之間進行遍歷,這樣就可以避免重複計算了。

#include

using

namespace std;

int a[50]

;int ans =0;

void

dfs(

int x,

int y)

for(

int i = y; i<= x; i++)}

intmain()

printf

("%d"

,ans)

;}

自然數拆分

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

自然數拆分

問題描述 自然數的拆分 任何乙個大於1的自然數n,總可以拆分成若干個自然數之和,並且有多種拆分方法。試求 n的所有拆分。例如自然數5,可以有如下一些拆分方法 5 1 1 1 1 1 5 1 1 1 2 5 1 2 2 5 1 4 5 2 3 注意,本題中n拆分出來的數x的範圍是1 x整數劃分可以參考...

自然數拆分

題目 給出sum min max和n四個正整數,請輸出所有將sum拆分為n個遞增的正整數 允許相等 之和,其中每個正整數k都滿足 min k max。在少俠的部落格 看到這道題 就隨手做了下。該題與輸出n個數取m個數的所有組合類似,只不過限定了m個數的和以及取值範圍。可以先用貪心演算法構造乙個最小的...