AcWing 167 木棒(搜尋)

2021-10-04 19:30:45 字數 859 閱讀 1784

深度搜尋 + 剪枝

原題鏈結

題目思路

從常用剪枝技巧開始

證明:2 反證法,若後面還有機會完整拼完,那麼一定會用到這一截木棍(『第一截』),矛盾。

證明:3 反證法,若此處不用當前小截木棍,而換成其他截木棍組成等長的,再補上。那麼這截放到後面可以完整拼成的話,是矛盾的,因為這截與剛才 『組成截』 等價,而剛才是拼不成的。

accode

#include

#include

#include

#include

using

namespace std;

const

int n =65;

int s[n]

, vis[n]

;int n, num =

0, len =0;

inline

intcmp

(int x,

int y)

bool

dfs(

int u,

int cur,

int start)

}return

false;}

intmain()

// 剪枝:優化搜尋順序

sort

(s,s+n,cmp)

; len = s[0]

;for

(; len != sum; len++)if

(sum%len ==0)

printf

("%d\n"

, len);}

return0;

}

acwing167 深度搜尋 剪枝 木棒

喬治拿來一組等長的木棒,將它們隨機地砍斷,使得每一節木棍的長度都不超過50個長度單位。然後他又想把這些木棍恢復到為裁截前的狀態,但忘記了初始時有多少木棒以及木棒的初始長度。請你設計乙個程式,幫助喬治計算木棒的可能最小長度。每一節木棍的長度都用大於零的整數表示。輸入包含多組資料,每組資料報括兩行。第一...

AcWing 167 木棒(dfs 剪枝)

喬治拿來一組等長的木棒,將它們隨機地砍斷,使得每一節木棍的長度都不超過50個長度單位。然後他又想把這些木棍恢復到為裁截前的狀態,但忘記了初始時有多少木棒以及木棒的初始長度。請你設計乙個程式,幫助喬治計算木棒的可能最小長度。每一節木棍的長度都用大於零的整數表示。注意 資料中可能包含長度大於50的木棒,...

AcWing 171 送禮物(搜尋)

雙向搜尋 將整個需要搜尋的物件分成兩半 在已知初態與終態的時候可以考慮 原題鏈結 感悟 首先可能會思考動態規劃,但它的時間複雜度是 nv v太大了,不適合。n比較小,可以考慮爆搜。然後這裡有個非常好的技巧,就是把原資料分成兩半,在通過一些技巧,剪枝,可以有效的降低時間複雜度。本題思路 先搜尋前 n ...