雙向搜尋可以避免在深層子樹上浪費時間。在一些題目中,問題不但具有初態,還具有明確的終態,,並且從初態開始搜尋與從終態開始逆向搜尋的搜尋樹都能覆蓋整個狀態空間。在這種情況下就可以採用雙向搜尋——從初態和終態出發各搜尋一半狀態,產生兩棵深度減半的搜尋樹,在中間交匯組合成最終的答案
如果直接進行指數型的列舉 則複雜度過高
所以要用雙向搜尋,先從前一半禮物中選出若干個,可能達到的值都放進乙個陣列a中,並且進行排序和去重
之後進行二次搜尋,從後一半禮物中選出一些,對於每個可能達到的t,在陣列a中二分查詢小於等於w-t的數值中的最大的乙個,
二者相加則為答案
詳見**:
#includeusing namespace std;
long long n,w,g[50],ans,m;
vectora;
void dfs1(long long k,long long nw)
dfs1(k-1,nw);
if(nw+g[k]<=w) dfs1(k-1,nw+g[k]); }
void dfs2(long long k,long long nw)
dfs2(k+1,nw);
if(nw+g[k]<=w)dfs2(k+1,nw+g[k]);
}bool cmp(long long a,long long b)
int main()
2401 送禮物 雙向搜尋)
題目描述 作為懲罰,gy被遣送去幫助某神牛給女生送禮物 gy 貌似是個好差事 但是在gy看到禮物之後,他就不這麼認為了。某神牛有n個禮物,且異常沉重,但是gy的力氣也異常的大 b 他一次可以搬動重量和在w w 2 31 1 以下的任意多個物品。gy希望一次搬掉盡量重的一些物品,請你告訴他在他的力氣範...
送禮物 雙向dfs
思路 dfs 先把a陣列排序,由大變小 dfs出前n 2 2 可以湊出的數,放到陣列s中 把s陣列去重排序,行成乙個單調遞增序列 再dfs剩下的數 可以組成的數,每組成乙個,二分找s陣列匹配的最大值 include includeusing namespace std typedef long lo...
雙向DFS 送禮物
達達幫翰翰給女生送禮物,翰翰一共準備了n個禮物,其中第i個禮物的重量是g i 達達的力氣很大,他一次可以搬動重量之和不超過w的任意多個物品。達達希望一次搬掉盡量重的一些物品,請你告訴達達在他的力氣範圍內一次效能搬動的最大重量是多少。輸入格式 第一行兩個整數,分別代表w和n。以後n行,每行乙個正整數表...