達達幫翰翰給女生送禮物,翰翰一共準備了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行,每行乙個正整數表...