题意:
思路:折半搜索,这道题爆搜复杂度2^n,当n为36时肯定会tle,但折半搜索可以将复杂度降低到2*2^n,还是可以接受的。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 45;
ll n, s, a[N];
map<ll, int> mp;
void dfs(int now, ll tot, int sum) {
if(now == n / 2 + 1) {
mp[tot] = sum;
return;
}
dfs(now + 1, tot, sum << 1);
dfs(now + 1, tot + a[now], sum << 1 | 1);
}
void print(int len, int ss) {
string s1;
while(ss) {
s1.push_back((char)(ss % 2 + '0'));
ss /= 2;
}
reverse(s1.begin(), s1.end());
int sh = 0;
if(s1.size() <= len) {
sh = n / 2 - s1.size();
}
while(sh) {
cout << "0";
sh--;
}
cout << s1;
}
void dfs1(int now, ll tot, int sum) {
if(now == n + 1) {
int ss = mp[s - tot];
if(ss != 0) {
print(n / 2, ss);
int len = n - n / 2 - 1;
print(len, sum);
}
return;
}
dfs1(now + 1, tot, sum << 1);
dfs1(now + 1, tot + a[now], sum << 1 | 1);
}
int main() {
cin >> n >> s;
for(int i = 1; i <= n; i++)
cin >> a[i];
dfs(1, 0, 0);
dfs1(n / 2 + 1, 0, 0);
return 0;
}