正题
题目大意
nnn个砝码,选择若干个要求重量不超过ccc的情况下最重。
解题思路
拆成两部分来dfsdfsdfs,第一部分将答案加入setsetset。
第二部分对于每个答案在setsetset中查询。
时间复杂度O(2n2logn)O(2^{\frac{n}{2}}\ log\ n)O(22n log n)
codecodecode
#include<cstdio>
#include<algorithm>
#include<set>
#define ll long long
using namespace std;
set<int> s;
ll n,c,mins,maxs,w[50];
void dfs1(ll x,ll z){if(z>c) return;if(x>n/2){mins=min(mins,z);s.insert(z);return;}dfs1(x+1,z+w[x]);dfs1(x+1,z);
}
void dfs2(ll x,ll z){if(z+mins>c) return;if(x>n){ll k=*--s.upper_bound(c-z);maxs=max(maxs,z+k);return;}dfs2(x+1,z+w[x]);dfs2(x+1,z);
}
int main()
{scanf("%lld%lld",&n,&c);for(ll i=1;i<=n;i++)scanf("%lld",&w[i]);dfs1(1,0);dfs2(n/2+1,0);printf("%lld",maxs);
}