# 題目

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;
}