P1120 小木棍 資料加強版

2022-05-10 03:15:08 字數 1190 閱讀 3637

喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過 505050 。

現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。

給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。

輸入格式:

共二行。

第一行為乙個單獨的整數n表示砍過以後的小木棍的總數,其中 n≤65n≤65n≤65

(管理員注:要把超過 505050 的長度自覺過濾掉,坑了很多人了!)

第二行為 nnn 個用空個隔開的正整數,表示 nnn 根小木棍的長度。

輸出格式:

乙個數,表示要求的原始木棍的最小可能長度

輸入樣例#1:複製

95 2 1 5 2 1 5 2 1

輸出樣例#1:複製

2017/08/05

資料時限修改:

-#17 #20 #22 #27 四組資料時限 500ms500ms500ms

-#21 #24 #28 #29 #30五組資料時限 1000ms1000ms1000ms

其他時限改為 200ms200ms200ms (請放心食用)

從木棍中小於等於50的最大值開始向後迴圈,如果\(k\)是總和的因數就dfs判斷是否合法。

判斷方法:用所有的小木棍能否拼出\(sum/k\)根木棍

剪枝:用桶儲存木棍

每次從大向小列舉木棍加入

如果有與剩餘長度相同的一根小木棍則不用考慮使用其餘小木棍拼出此長度

#include#include#include#includeusing namespace std;

int i,m,n,j,k,c[51],sum,maxx;

bool check(int l,int now,int k,int d,int st)

for(int i=min(k,st);i>=1;i--)

else if(check(l,now,k-i,d,i)) return 1;

d[i]+=1;}}

return 0;

}int main()

} c[0]=0x3f3f3f3f;

for(int now=maxx;now;now++)

}}

P1120 小木棍 資料加強版

喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過 50 現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。首先在讀入的時候忽略掉長度大於50的木棍 最重要 順便還要記錄一下最短的木...

P1120 小木棍 資料加強版

原題鏈結 不得不說,這題真的是一道深度搜尋毒瘤題qwq,整整坑了我乙個上午。先說一下大體思路 1.讀入資料的同時 注意過濾掉長度大於50的木棍 算出所有小木棍的總和sum,因為至少所有的小木棍會拼成一根長度為sum的超大木棍 2.找出所有小木棍中長度最大的那根max,原始長度len一定大於等於這個m...

P1120 小木棍 資料加強版

一道不錯的剪枝題,用到的剪枝優化比較多,剪枝思路也值得學習 在這裡我只採取了能通過此題的剪枝,似乎還可以繼續優化?剪枝講解在注釋裡 include include include include includeusing namespace std const int maxn 70 inline ...