題意: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...