acwing167 深度搜尋 剪枝 木棒

2021-10-08 17:17:42 字數 1223 閱讀 3040

喬治拿來一組等長的木棒,將它們隨機地砍斷,使得每一節木棍的長度都不超過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...