# 題目
AP325 Q-2-10. 子集合的和 (折半枚舉)
# 解題思路
目前沒東西...
# 程式碼
#include<bits/stdc++.h> | |
using namespace std; | |
#define Rabbir_Reaper ios_base::sync_with_stdio(0); cin.tie(0); | |
typedef long long LL; | |
LL p,mx; | |
//recursive generate sum of subsets | |
void rgs(vector<LL> &v,int idx,LL now,unordered_set<LL> &st){ | |
if(now > p) return; | |
if(idx >=(int) v.size()){ | |
st.insert(now); | |
return; | |
} | |
rgs(v,idx+1,now+v[idx],st); | |
rgs(v,idx+1,now,st); | |
} | |
signed main(){ | |
Rabbir_Reaper | |
vector<LL> v1,v2; | |
unordered_set<LL> st1,st2; | |
int n; | |
cin>>n>>p; | |
for(LL i=0,temp;i<n/2;i++){ | |
cin>>temp; | |
v1.push_back(temp); | |
} | |
for(LL i=n/2,temp;i<n;i++){ | |
cin>>temp; | |
v2.push_back(temp); | |
} | |
rgs(v1,0,0,st1); | |
rgs(v2,0,0,st2); | |
vector<LL> vst2(st2.begin(),st2.end()); | |
sort(vst2.begin(),vst2.end()); | |
mx = vst2.back(); | |
for(auto &u:st1){ | |
auto it = upper_bound(vst2.begin(),vst2.end(),p-u); | |
if(it == vst2.begin()){ | |
mx = max(mx,u); | |
}else{ | |
mx = max(mx,*(--it) + u); | |
} | |
} | |
cout<<mx; | |
} |