一道不錯的剪枝題,用到的剪枝優化比較多,剪枝思路也值得學習
在這裡我只採取了能通過此題的剪枝,似乎還可以繼續優化?
剪枝講解在注釋裡
#include#include#include#include#includeusing namespace std;
const int maxn=70;
inline int read()
while(ch<='9'&&ch>='0')
return f*ret;
}int n;
int a[maxn];
int fla[maxn];
int vis[maxn];
int last;
int x;
bool cmp(int x,int y)
inline bool dfs(int nu,int len,int ls,int t)
if(len==t)
last=0;
/* 考慮到我們為什麼要從ls開始列舉?
la是該木棒上乙個列舉的木棍的下標,因為木棍陣列是降序排序的
具有單調性,ls是個較大的值,在ls前的數一定是大於la的數
我們已知,上乙個狀態的len+a[ls]=目前的len,所以,a[ls]是<=t-len(上一狀態)&&符合題意的最大值
所以當前狀態直接由ls開始列舉即可
*/ for(int i=ls;i<=n;i++)
} }return false;}/*
剪枝和dfs都非常巧妙
將目標狀態分為兩個部分
1 湊齊當前木棍
2 還原所有木棍
第二個狀態由1 組成
*/ int main()
n=tot;
sort(a+1,a+1+n,cmp);
memset(vis,0,sizeof(vis));
for(int i=l;i<=r;i++)
x=r/i;
if(dfs(1,0,1,i))
} return 0;
}
P1120 小木棍 資料加強版
喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過 50 現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。首先在讀入的時候忽略掉長度大於50的木棍 最重要 順便還要記錄一下最短的木...
P1120 小木棍 資料加強版
原題鏈結 不得不說,這題真的是一道深度搜尋毒瘤題qwq,整整坑了我乙個上午。先說一下大體思路 1.讀入資料的同時 注意過濾掉長度大於50的木棍 算出所有小木棍的總和sum,因為至少所有的小木棍會拼成一根長度為sum的超大木棍 2.找出所有小木棍中長度最大的那根max,原始長度len一定大於等於這個m...
P1120 小木棍 資料加強版
喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過 505050 現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。輸入格式 共二行。第一行為乙個單獨的整數n表示砍過以後的小木棍的總...