題目:小木棍
思路:搜尋+剪枝。
外層迭代加深,列舉最小長度,用dfs判斷。
dfs維護3個變數x,y,lst,即用了x根木棍,當前拼到了y,上一根木棍的長度為lst。
然後列舉拼接的木棍就好。
剪枝一:從大到小排序。
剪枝二:如果y不為0,那麼列舉的木棍長不要大於lst,不然就會重複搜尋。
剪枝三:如果y==0且列舉的當前木棍不可行那麼就不用再往後列舉。
剪枝四:如果 y+當前木棍長 == 列舉的mid ,且當前木棍不可行,可直接return false。
剪枝五:相同長度的木棍在同一層只用考慮一根就好。
**:
#pragma gcc optimize(2)
#include
using
namespace std;
#define maxn 65
#define read(x) scanf("%d",&x)
int n,m;
int a[maxn+5]
;int mid;
bool use[maxn+5]
;bool
dfs(
int x,
int y,
int lst)
return
false;}
bool
cmp(
const
int& x,
const
int& y)
intmain()
sort
(a+1
,a+n+
1,cmp)
;for
(mid=a[1]
;mid<=m;mid++
)printf
("%d"
,mid)
;return0;
}
洛谷 P1120 小木棍 資料加強版
喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過5050。現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。搜尋加剪枝 剪枝 1 使用桶排,因為長度不超過50。2 列舉的長度應該能...
洛谷P1120 小木棍 資料加強版
喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過50。現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。共二行。第一行為乙個單獨的整數n表示砍過以後的小木棍的總數,其中n 65 管...
洛谷p1120小木棍 資料加強版 c
dfs剪枝 主要難點在於如何進行dfs的剪枝,典型例題如小木棍 洛谷p1120小木棍 可以二分答案 不二分也不會超時,我的 沒有二分 dfs看看這個答案可不可行 雖然資料很小,直接dfs也是會超時的,所以需要加入一些剪枝。1.從max 最大木棍長度,總木棍長度 要分的段數 為左面,所有木棍長度為右面...