深度搜尋 + 剪枝
原題鏈結
題目思路
從常用剪枝技巧開始
證明: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 ...