POJ 1011 Sticks 解題報告

2021-06-19 00:17:39 字數 1133 閱讀 9140

參考(其實是完全移植了)這裡的解題報告:

感覺搜尋題做傷了。短期之內不會再做了。

首先,sticks要從大到小排序。因為大的stick相對難找,一開始就確定好有利於更快地確定解。

其次,記下當前正在匹配的stick,下次從這個stick之後開始試。

再次,如果當前的stick和前乙個stick的長度一樣,而前乙個stick沒有選(前乙個stick肯定乙個嘗試過了,沒選是因為沒有解),說明這個stick也不用嘗試了。

個人認為要點在於鏈結中的第3點,即如果當前len等於0,即(匹配完了上一段或最開始),新開始一段時,只需要取第乙個沒選的(也是最大的,因為sticks已經從大到小排序好了。)。不用再像普通迴圈裡面的那樣,乙個乙個嘗試了。因為如果有解,這個第乙個stick遲早要選,而且位置在**都不關心,所以第乙個選它就可以了。

code已經改得和鏈結上面幾乎完全一樣了。這裡為了日後記錄,遂貼上與此。

#include #include using namespace std;

const int maxn = 65;

int n, len;

int sticks[maxn];

bool mark[maxn];

bool flag;

void recur(int depth, int l, int k)

if(l == 0)

mark[i] = true;

recur(depth + 1, sticks[i], i + 1);

mark[i] = false;

return; }

if(l == len)

else

return;

} for(int i = k; i < n; i++)

mark[i] = true;

recur(depth + 1, l + sticks[i], i + 1);

mark[i] = false;

} }}int main()

sort(sticks, sticks + n, greater());

for(len = sticks[0]; len <= sum; ++len)

}} }

return 0;

}

poj 1011 sticks(搜尋 剪枝)

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

poj1011 Sticks 搜尋 剪枝

題目大意 george有一捆相同長度的木棍,但是他把這些木棍砍段了,現在想知道這些木棍原來長度是多少 即還原木棍 求可能的最小的原木棍長度。如下 include include include include includeusing namespace std int n,stick 64 use...

暴力搜尋 POJ 1011 Sticks

首先這道題目有兩個非常重要的剪枝1 如果當前放的是木塊的第乙個那如果當前dfs不成立,那麼直接返回false因為每乙個木板必定屬於乙個塊,當他放第乙個的時候如果可以放其他的其實是已經固定了的了,如果當前不成立那麼不存在隊友可以和他一起站對。2 就是如果當前這個和前一次進行dfs的木板長度一樣,就跳過...