小木棍 資料加強版

2021-08-28 22:27:50 字數 722 閱讀 3345

預先處理出所有木棍的總長度,且保證列舉答案的值能被總長度整除。

每根木棍的長度可用桶來儲存,並且預先處理出最長的和最短的木棍的長度,搜尋時從最大長度到最小長度遞減列舉。

若拼接當前木棍時已用了一根長為x的木棍,則dfs時從長度x開始搜尋。

若某組拼接不成立,且此時 已拼接的長度為0 或 當前已拼接的長度與剛才列舉的長度之和為最終列舉的答案 時,則可直接跳出迴圈,因為此時繼續列舉其它更小的值時,顯然可能情況更少,且同樣湊不完。

#include#include#include#includeusing namespace std;

const int n=70;

int n,a[n],cnt,ans,s;

bool cmp(int x,int y)

bool b[n];

inline void dfs(int ass,int sum,int g,int p)

if(ans-assif(ass==g)

for(int i=p;i<=cnt;i++)

if(!b[i]&&ass+a[i]<=g) }

int main()

} sort(a+1,a+cnt+1,cmp);

for(int i=s;i<=ans/2;i++)

if(ans%i==0) dfs(0,0,i,1);

printf("%d\n",ans);

}

P1120 小木棍 資料加強版

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

洛谷 1120 小木棍 資料加強版

題目描述 喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過5050。現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。輸入輸出格式 輸入格式 共二行。第一行為乙個單獨的整數n表示砍...

P1120 小木棍 資料加強版

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