POJ1011題解 dfs 減枝

2021-10-12 14:37:51 字數 1230 閱讀 1541

題意:n根不同長度的小棍,拼成若干長棍,要這些長棍的長度相等,並且小棍剛好用完,問拼成長棍的最短長度是?

思路:首先考慮搜尋的方向,最短,那肯定是從最短的情況開始遞增,最短的可能情況那肯定就是最長的的單個棍子,所以首先把這些小棍排序,從大到小,並計算這些棍子總和,拼成的長棍的長度從最長的小棍開始搜尋,搜尋的過程也是判斷,用總和除以這個長度得到應該拼成的長棍個數,遞迴搜尋判斷小棍之間能否相組合成滿足這麼多個長度相等的長棍。

在搜尋過程中 注意四個地方可以剪枝(效果還是很驚人的)

1.搜尋的起點是最長的小棍長度,而不用從1開始。

2.用乙個used陣列標記,哪個小棍用過了。

3.(重要)當乙個棍子發現沒有棍子可以與他配對,直接跳過,

後面的棍子嘗試,這次棍子長度絕對不滿足,直接嘗試下乙個長度。

4.(重要)當乙個棍子的長度已經被否定不能與這個棍子配對,避免出現下個

與上個相同的情況,搜尋重複,由於排好序的,如果這個和下個相等,

就移到不相等的數字再嘗試。

注意:(我自己寫題時候的為題)我覺得比較重要的 num++和num+1的區別:/num++運算後num實際取值為num+1,但顯示的結果仍未num,下次運算時用num+1的取值運算,但顯示num+1的值;num=num+1的值顯示和實際的都為num+1.

**:

#include

#include

#include

using

namespace std;

int n,sum,num,flag;

int a[65]

,vis[65]

;bool

cmp(

int x,

int y)

void

dfs(

int num1,

int len,

int pos)

if(num1==num)

for(

int i=pos;i)else

if(sum/num>a[i]

+len)}}

intmain

(int argc,

char

** ar**)

sort

(a,a+n,cmp)

;for

(int i=a[0]

;i<=sum;i++)}

}return0;

}

POJ1011 木棒(dfs 剪枝)

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

poj 1011 Sticks 減枝搜尋

題意 有n根棍子,分別有長度。問將其拼接成x根,長度相同,求最小長度。解法搜尋。1.因為總共n根棍子,最多拼接成n根相同長度,並且,組成的棍子數量越多,則長度則越小 2.拼接的棍子數量必定能夠 被 sum 整除 3.若當前棍子長度 stick i 不能夠匹配,在 stick i left len 或...

POJ1011 一種dfs實現

已經刪掉了剪枝,如果要ac還要繼續剪枝,思路大家可以自己思考一下 本題主要使用的思想是dfs的第三種型別,還原現場,dfs三種型別詳情可參閱本人部落格poj1015那篇 include include includeusing namespace std int n int maxx int min...