參考(其實是完全移植了)這裡的解題報告:
感覺搜尋題做傷了。短期之內不會再做了。
首先,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的木板長度一樣,就跳過...