ACwing 171 送禮物 雙向搜尋

2021-09-26 08:25:12 字數 1370 閱讀 8417

達達幫翰翰給女生送禮物,翰翰一共準備了n個禮物,其中第i個禮物的重量是g[i]。

達達的力氣很大,他一次可以搬動重量之和不超過w的任意多個物品。

達達希望一次搬掉盡量重的一些物品,請你告訴達達在他的力氣範圍內一次效能搬動的最大重量是多少。

輸入格式

第一行兩個整數,分別代表w和n。

以後n行,每行乙個正整數表示g[i]。

輸出格式

僅乙個整數,表示達達在他的力氣範圍內一次效能搬動的最大重量。

資料範圍

1≤n≤45,

1≤w,g[i]≤2^31−1

輸入樣例:

20 575

4181輸出樣例:

19列舉每個禮物選or不選 2^45 tle

我們列舉前一半禮物組合出的重量res存入陣列b中,排序去重

列舉後一半禮物組合出的重量res,在b中二分查詢滿足<=w-res的最大值,更新答案

2 ^ 23 ≈ 8e6

log2(2 ^ 23) = 23

複雜度1e7左右

剪下支勉強過

禮物重量降序排序

方便起見,列舉是二進位制列舉

#include

using

namespace std;

typedef

long

long ll;

const

int n=47;

ll a[n]

,b[1

<<23]

,c[1

<<23]

;ll w,n,m,m,st,ans,tot,tol;

inline

void

discrete()

void

binary_find

(ll x)

}bool

cmp(

int a,

int b)

intmain()

if(res>w)

continue;if

(res==w)

return cout

]=res;

}discrete()

; m=n-m,st=

1

int i=

0;i++i)

if(res>w)

continue;if

(res==w)

return cout

(res);}

cout

}

AcWing 171 送禮物(搜尋)

雙向搜尋 將整個需要搜尋的物件分成兩半 在已知初態與終態的時候可以考慮 原題鏈結 感悟 首先可能會思考動態規劃,但它的時間複雜度是 nv v太大了,不適合。n比較小,可以考慮爆搜。然後這裡有個非常好的技巧,就是把原資料分成兩半,在通過一些技巧,剪枝,可以有效的降低時間複雜度。本題思路 先搜尋前 n ...

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