廢話不多說,直接看題。
就像這樣,只是情況有變,把乙個數分成更多的數的和就ok了。
既然搜尋,就先考慮一下用深搜還是廣搜,就用深搜把(個人偏愛),那怎麼搜呢?舉個栗子以題目的栗子為栗,7怎麼分?為了按順序,那麼第一位先取1吧,接下來我們還有6要分,還剩下兩個數;第二位也取1吧,那麼我們還有5要分,還剩下1個數的位置,於是我們就會發現還剩下乙個數的位置,只能放5了,那麼就方案數加1,返回。
這樣整個搜尋程式不就豁然開朗了嗎?放進去三個引數,分別是上乙個數的值,剩餘要分的數的個數與剩下要分的數值。
此時我想你一定會有乙個大大的問號吧,為什麼要傳上乙個數的值呢?因為按照之前的栗子,為了按順序來,是不是後面的數總會保持比前乙個數大或者相等,這一點很容易理解,如果比之前的數小了,會出現重複(如1,1,5和5,1,1重複)的情況,正是如此,我們所要每一次填進去的數的範圍也會得到減小,抽象的來說就是這樣:前乙個數<=本次所填的數《剩下要分的數值/數的個數(這是最不好理解的地方,此處的限制是為了防止前面的數過大,而後面的數連1都不能取,這樣可以有效的避免了這種情況,所以在邊界條件處不需要再進行判斷還能不能取,因為後面的數都會滿足這個關係式,所以後面的數最小都可以等於這個所填的數,所以剩下要分的數值/數的個數能保證後面的數大於或等於這個所填數),這樣程式就寫出來了(**比較簡單且上文有解釋,就不寫注釋了,原諒小編的手懶):
1 #include2using
namespace
std;
3int n,k,a[10000],sum=0
,ans;
4void dfs(int past,int cnt,int
num)511
for(int i=past;i<=num/cnt;i++)
12 dfs(i,cnt-1,num-i);13}
14int
main()
15
數的劃分 搜尋 ,DP
time limit 1 sec memory limit 128 mb 64bit io format lld submitted 44 accepted 22 submit status web board 將整數n分成k份,且每份不能為空,任意兩份不能相同 不考慮順序 例如 n 7,k 3,下...
洛谷1025 數的劃分 搜尋
將整數n分成k份,且每份不能為空,任意兩份不能相同 不考慮順序 例如 n 7,k 3,下面三種分法被認為是相同的。1,1,5 1,5,1 5,1,1 問有多少種不同的分法。輸入格式 n,k 6輸出格式 乙個整數,即不同的分法。輸入樣例 1 7 3輸出樣例 1 4四種分法為 1,1,5 1,2,4 1...
動態規劃深度搜尋數的劃分
乙個正整數可以劃分為多個正整數的和,比如n 6時 6 1 5 2 4 3 3 2 2 2 1 1 4 1 2 3 1 1 1 3 1 1 2 2 1 1 1 1 2 1 1 1 1 1 1 共有十一種劃分方法。給出乙個正整數,問有多少種劃分方法。乙個正整數n 乙個正整數,表示劃分方案數 n 100 ...