https://ac.nowcoder.com/acm/contest/889/D
降低指数级数据的复杂度(本题从2^36降至2^18)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll num[40];
set<ll> st;
map<ll,ll> mp;
int main()
{
ll n,s;
cin>>n>>s;
int mid=n/2;//二分搜索 把数量级从10次方降到6次方
int right=n-mid;
for(int i=0;i<n;i++){
scanf("%lld",&num[i]);
}
//前半段
for(int i=0;i<(1<<mid);i++){//二进制序列
ll res=0;
for(int j=0;j<mid;j++){
if(i&(1<<j))res+=num[j];//把二进制序列中为1的位累加起来 也就是枚举前半段所有的情况
}
st.insert(res);
mp[res]=i;//st与mp配套
}
for(int i=0;i<(1<<right);i++){
ll res=0;
for(int j=0;j<right;j++){
if(i&(1<<j))res+=num[j+mid];
}
if(st.find(s-res)!=st.end()){
for(int j=0;j<mid;j++)if(mp[s-res]&(1<<j))putchar('1');else putchar('0');
for(int j=0;j<right;j++)if(i&(1<<j))putchar('1');else putchar('0');
puts("");
return 0;
}
}
return 0;
}