P1120 小木棍 資料加強版

2022-03-30 20:43:06 字數 1046 閱讀 4393

一道不錯的剪枝題,用到的剪枝優化比較多,剪枝思路也值得學習

在這裡我只採取了能通過此題的剪枝,似乎還可以繼續優化?

剪枝講解在注釋裡

#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表示砍過以後的小木棍的總...