洛谷 P1120 小木棍 資料加強版

2021-09-27 03:07:27 字數 603 閱讀 3523

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

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

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

搜尋加剪枝

剪枝:1、使用桶排,因為長度不超過50。

2、列舉的長度應該能整除總長度。

3、若當前搜尋時已經使用了長度為 x

xx 的木棍,則下次直接從長度為 x

xx 從大到小列舉

4、若某次搜尋拼接時,當前拼好的長度為0或當前長度加上先前列舉的長度等於需要長度,直接跳出迴圈

#includeusing namespace std;

int n,ai,sum,maxl,minl;

int a[70],b[70];

void dfs(int lev,int now,int len,int pos)

}int main()

for(int i=maxl;i<=sum;i++)

if(sum%i==0)

dfs(sum/i,0,i,maxl);

cout<}

洛谷 P1120 小木棍 資料加強版

題目 小木棍 思路 搜尋 剪枝。外層迭代加深,列舉最小長度,用dfs判斷。dfs維護3個變數x,y,lst,即用了x根木棍,當前拼到了y,上一根木棍的長度為lst。然後列舉拼接的木棍就好。剪枝一 從大到小排序。剪枝二 如果y不為0,那麼列舉的木棍長不要大於lst,不然就會重複搜尋。剪枝三 如果y 0...

洛谷P1120 小木棍 資料加強版

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

洛谷p1120小木棍 資料加強版 c

dfs剪枝 主要難點在於如何進行dfs的剪枝,典型例題如小木棍 洛谷p1120小木棍 可以二分答案 不二分也不會超時,我的 沒有二分 dfs看看這個答案可不可行 雖然資料很小,直接dfs也是會超時的,所以需要加入一些剪枝。1.從max 最大木棍長度,總木棍長度 要分的段數 為左面,所有木棍長度為右面...