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

2021-08-06 01:53:49 字數 1066 閱讀 1420

**dfs剪枝**

主要難點在於如何進行dfs的剪枝,典型例題如小木棍

[洛谷p1120小木棍](

可以二分答案(不二分也不會超時,我的**沒有二分),dfs看看這個答案可不可行

雖然資料很小,直接dfs也是會超時的,所以需要加入一些剪枝。

1.從max(最大木棍長度,總木棍長度/要分的段數)為左面,所有木棍長度為右面二分答案。

2.木棍長度要排序,方便每次dfs從小到大,為避免重複搜尋(比如說2 3 4 和2 4 3)定義乙個pos,每次列舉從pos開始,這也是為什麼排序的原因之一。

3.如果現在搜尋狀態的剩餘長度和二分答案的長度相等,還搜不出答案,說明有木棍無解,直接break跳出迴圈。

4.如果現在搜尋狀態的剩餘長度和迴圈搜尋到木棍的長度相等,那麼下一次dfs的狀態如3,還搜不出答案,說明有木棍無解,直接break跳出迴圈。

5.如果這個長度的木棍搜不出答案,相同長度的也搜不出答案。

下面是滿分**(ac資料加強版)

#include

#include

#include

#include

#include

#include

using

namespace

std;

bool vis[101];

int n,a[101],tot,all,len;

int cmp(int x,int y)

bool dfs(int now,int pos,int d)

if(now==0)

if(dfs(len,1,d+1)==1) return

1; for(int i=pos;i<=n;++i)

if(vis[i]==0&&a[i]<=now)

return0;}

int main()

else all+=a[i];

}sort(a+1,a+1+n,cmp); //2

for(int i=a[1];i<=all;++i) //1}}

}

洛谷 P1120 小木棍 資料加強版

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

洛谷 P1120 小木棍 資料加強版

喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過5050。現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。搜尋加剪枝 剪枝 1 使用桶排,因為長度不超過50。2 列舉的長度應該能...

洛谷P1120 小木棍 資料加強版

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