喬治拿來一組等長的木棒,將它們隨機地砍斷,使得每一節木棍的長度都不超過50個長度單位。
然後他又想把這些木棍恢復到為裁截前的狀態,但忘記了初始時有多少木棒以及木棒的初始長度。
請你設計乙個程式,幫助喬治計算木棒的可能最小長度。
每一節木棍的長度都用大於零的整數表示。
輸入包含多組資料,每組資料報括兩行。
第一行是乙個不超過64的整數,表示砍斷之後共有多少節木棍。
第二行是截斷以後,所得到的各節木棍的長度。
在最後一組資料之後,是乙個零。
為每組資料,分別輸出原始木棒的可能最小長度,每組資料佔一行。
資料保證每一節木棍的長度均不大於50。
本題是相對簡單的深度搜尋思想,但是主要是卡的時限,思路要經過剪枝才能ac。
解釋都在**裡。
#include
#include
#include
using
namespace std;
const
int n =70;
int n;
int sum, length;
int sticks[n]
;bool st[n]
;//組裝好的是木棍,未組裝的是木棒
//u是已經組成的木棍的個數
//cur是當前正在組裝木棒的長度
//strat木棒使用到了到第幾根
bool
dfs(
int u,
int cur,
int start)
}return
false;}
intmain()
// 剪枝:優化搜尋順序
//將大的木棒排在前面,方便組裝
sort
(sticks, sticks + n)
;reverse
(sticks, sticks + n)
;//排除大於50的木棒
for(
int i =
0; i < n; i ++)if
(sticks[i]
>50)
st[i]
=true
;//通過遍歷木棍可能的長度,得到結果
while
(true
) length ++
;//木棍組成的最小長度增加}}
return0;
}
AcWing 167 木棒(dfs 剪枝)
喬治拿來一組等長的木棒,將它們隨機地砍斷,使得每一節木棍的長度都不超過50個長度單位。然後他又想把這些木棍恢復到為裁截前的狀態,但忘記了初始時有多少木棒以及木棒的初始長度。請你設計乙個程式,幫助喬治計算木棒的可能最小長度。每一節木棍的長度都用大於零的整數表示。注意 資料中可能包含長度大於50的木棒,...
AcWing 167 木棒(搜尋)
深度搜尋 剪枝 原題鏈結 題目思路 從常用剪枝技巧開始 證明 2 反證法,若後面還有機會完整拼完,那麼一定會用到這一截木棍 第一截 矛盾。證明 3 反證法,若此處不用當前小截木棍,而換成其他截木棍組成等長的,再補上。那麼這截放到後面可以完整拼成的話,是矛盾的,因為這截與剛才 組成截 等價,而剛才是拼...
深度優先搜尋 回朔 奇偶剪枝
題目描述 題解 基本演算法思路就是深搜,不過會超時,因此得奇數偶數剪枝,就可以ac了。file name dogmaze.cpp 深度優先搜尋加回朔加奇數偶數剪枝 author yyhaker created time 2017 6 1 include include include include...