307 Sticks( )經典DFS 剪枝

2021-08-26 18:41:24 字數 808 閱讀 9409

/*

題意:長度相同的木棒被分成許多段,求木棒原來狀態的最短長度

此題重在剪枝,主要剪枝思路有:

使用陣列a儲存被分解成的各個部分的長度,木棒的每段被稱之為s

①搜尋範圍從max到sum,且必須能被sum整除

②為避免重複,組合成木棒的s從大到小排序,每根木棒的第乙個s,也要求從大到小排序

③在某層搜尋中,如果a[i]沒有使用,且a[i]==a[i+1],則a[i+1]也要捨棄

④搜尋中,木棒的第乙個s,a[i]為可滿足的最大值,如果嘗試失敗,則直接退出,返回到上一層搜尋

完全參考:心如止水c++部落格

*/#include #include #include // #define local

#ifdef local

#include#endif

int a[60];

bool used[60];

int aim,num;

int n;

int cmp(const void *a,const void *b)

bool dfs(int stick,int len,int pos)

qsort(a,n,sizeof(a[0]),cmp);

for(aim=max;aim<=sum;aim++)

}} }

#ifdef local

printf("used time = %.3lf\n",(double)clock()/clocks_per_sec);

#endif

return 0;

}

UVa 307 Sticks(暴力 剪枝)

給出一些木棍的長度,把這些木棍拼成長度相同的長木棍,求最短的長度。首先對所有木棍進行降序排序,然後開始列舉,列舉下界是小木棍長度的最大值,上界是小木棍長度之和的一半。在列舉的過程中必須進行剪枝,否則會超時。1 當前列舉的長木棍長度不是小木棍長的和的因數時跳過。2 與當前小木棍長度相同的小木棍沒有使用...

題解 Sticks 小木棍

uva luogu remotejudge需登uva luogu 加強版 每組資料給出n根小木棍,把它們拼接成若干根長度相等的木棍,求該長度的最小值。這題似乎就是暴搜加剪枝優化,不過剪枝比較複雜。先上 include using namespace std int a 100 v 100 n,len...

poj 1011 sticks(搜尋 剪枝)

題型 搜尋題 題意 此題堪稱最經典搜尋題。description 喬治拿來一組等長的木棒,將它們隨機地裁斷,使得每一節木棍的長度都不超過50個長度單位。然後他又想把這些木棍恢復到為裁截前的狀態,但忘記了初始時有多少木棒以及木棒的初始長度。請你設計乙個程式,幫助喬治計算木棒的可能最小長度。每一節木棍的...