题意:有n个数,给定一个数s,问从这n个数中取出若干个数,使他们的和等于s的方案(输入保证一定存在唯一的方案)
题解可参考博客:
https://www.icode9.com/content-4-392733.html
标程里写的是折半搜索,看了上面的博客,自己打了一遍,感觉更像是枚举+二分搜索(表示不懂折半搜索是啥)。
#include<cstdio>
#include<iostream>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
map<ll,string> mp;
int n;
ll s,a[40];
int main()
{
cin>>n>>s;
for(int i=1;i<=n;i++)
cin>>a[i];
for(ll i=0;i<(1<<(n/2));++i) //二进制是个好东西
{
string t;
ll temp=0;
for(ll j=1;j<=n/2;++j)
{
if(i&(1<<(j-1)))
{
t+='1';
temp+=a[j];
}
else t+='0';
}
mp[temp]=t;
}
bool flag=0;
for(ll i=0;i<(1<<(n-n/2));++i) //这里起点和终点要搞清楚,不是1<<(n/2)~1<<n
{
string t;
ll temp=0;
for(ll j=1;j<=n-n/2;++j) //这里也是
{
if(i&(1<<(j-1)))
{
t+='1';
temp+=a[n/2+j];
}
else t+='0';
}
if(mp.find(s-temp)!=mp.end())
{
cout<<mp[s-temp]+t<<endl;
flag=1;
}
if(flag) break;
}
return 0;
}