預先處理出所有木棍的總長度,且保證列舉答案的值能被總長度整除。
每根木棍的長度可用桶來儲存,並且預先處理出最長的和最短的木棍的長度,搜尋時從最大長度到最小長度遞減列舉。
若拼接當前木棍時已用了一根長為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...