ソースコード
#include <bits/stdc++.h>
const long long MOD = 1000000007;
const int INF = INT_MAX / 2;
const long double PI = 3.1415926;
#define FOR(i, r, n) for(int i=(ll)(r); i<(ll)(n); i++)
#define REP(i, n) FOR(i, (0), n)
#define ALL(r) r.begin(), r.end()
#define ll long long int
#define vci vector<ll>
#define vcs vector<string>
#define vcp vector<pair<ll, ll>>
#define vct vector<tuple<ll, ll, ll>>
using namespace std;
//vector<vector<ll>> vv(n, vector<ll>(n));
typedef int Weight;
struct Edge
{
int from, to; Weight cost;
bool operator < (const Edge& e) const { return cost < e.cost; }
bool operator > (const Edge& e) const { return cost > e.cost; }
};
typedef vector<Edge> Edges;
typedef vector<Edges> Graph;
void add_edge(Graph &g, int from, int to, Weight cost)
{
g[from].push_back(Edge{ from, to, cost });
}
int main()
{
ll n;
cin >> n;
vci v(n), vsum;
REP(i, n) cin >> v[i];
ll cnt = 1, m = pow(2, n);
while(cnt<m)
{
ll tmp = cnt, sum = 0, pos=0;
while(tmp)
{
sum += (tmp & 1)*v[pos];
pos++;
tmp >>= 1;
}
vsum.push_back(sum);
cnt++;
}
sort(ALL(vsum),greater<ll>());
ll opsum;
cin >> opsum;
REP(i,vsum.size()-1)
{
if(vsum[i]==opsum&&vsum[i]!=vsum[i+1])
{
cout << vsum[i] << endl;
return 0;
}
}
cout << vsum[vsum.size() - 1] << endl;
}