2401 送禮物 雙向搜尋)

2022-05-23 16:48:10 字數 731 閱讀 4868

【題目描述】

作為懲罰,gy被遣送去幫助某神牛給女生送禮物(gy:貌似是個好差事)但是在gy看到禮物之後,他就不這麼認為了。某神牛有n個禮物,且異常沉重,但是gy的力氣也異常的大(-_-b),他一次可以搬動重量和在w(w<=2^31-1)以下的任意多個物品。gy希望一次搬掉盡量重的一些物品,請你告訴他在他的力氣範圍內一次效能搬動的最大重量是多少。
【題目鏈結】

2401 送禮物

【演算法】

雙向搜尋,把禮物按重量分成兩部分。第一次搜尋記錄下後一半禮物可能達到的重量,第二次搜尋對前一部分禮物可能達到的重量加上之前記錄的重量取小於w的最大值即可。

【**】

#include #define ll long long

using namespace std;

ll w,n,tot,ans;

ll a[50],rec[100010000];

void dfs1(ll x,ll val)

if(val+a[x]<=w) dfs1(x+1,val+a[x]);

dfs1(x+1,val);

}void dfs2(ll x,ll val)

ans=max(ans,val+rec[l]);

return;

}if(val+a[x]<=w) dfs2(x+1,val+a[x]);

dfs2(x+1,val);

}int main()

CH2401 送禮物 雙向搜尋

雙向搜尋可以避免在深層子樹上浪費時間。在一些題目中,問題不但具有初態,還具有明確的終態,並且從初態開始搜尋與從終態開始逆向搜尋的搜尋樹都能覆蓋整個狀態空間。在這種情況下就可以採用雙向搜尋 從初態和終態出發各搜尋一半狀態,產生兩棵深度減半的搜尋樹,在中間交匯組合成最終的答案 如果直接進行指數型的列舉 ...

送禮物 雙向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行,每行乙個正整數表...