小木棍 搜尋剪枝

2021-08-07 21:46:14 字數 942 閱讀 9544

小木棍,多麼經典的題目啊,幾年都拿出來做一下,今年終於感覺有點明白了(真為中年婦女的智商著急啊:()

題解抄的luogu題解,修改了以前抄的**,終於ac了.

主要難點在於如何進行dfs的剪枝可以二分答案(不二分也不會超時,我的**沒有二分),dfs看看這個答案可不可行雖然資料很小,直接dfs也是會超時的,所以需要加入一些剪枝。

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

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

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

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

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

#include#include#include#includeusing namespace std;

int a[110];//存小棒長大小最好大於64

int visited[110];//標記小棒是否被用

int n;//小棒個數

bool cmp( int a,int b)

int dfs(int len,int pos,int remains_len,int num)

for(int i=pos; i=a[i])

} return 0;

}int main() else

sum+=a[i];

} sort(a,a+n,cmp);

for(len=a[0]; len<=sum; len++)

} cout<

牛客 小木棍(DFS 搜尋剪枝)

時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過50。現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每...

深搜剪枝 小木棍

時間限制 1 sec 記憶體限制 128 mb 提交 7 解決 5 提交 狀態 討論版 命題人 add cy 喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過50。現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設...

P1120 小木棍 資料加強版 (搜尋 剪枝)

原題 題意 有n 65 根小木棍,長度a ia i ai 50 這些小木棍是由x根l長木棍切割而得,現在x和l不確定,讓你求最小的l。題目說了如果出現大於50的木棍要忽略。解析 首先當然是要列舉長度l了,下界為給出長度最大值mama ma,上界為所有木棍長度和sum sumsu m。當然sum su...