题目:Knapsack Cryptosystem
题意:给你n个数,和一个数m问你这个数m由哪些个数相加构成的。
思路:看到这道题的时候首先就想到了搜索,但是由于n是36暴力搜索一定会超时,所以我们就有折半搜索。把n个数一分为2,分别暴力。
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn = 100;
LL a[maxn];
int n, m;
map<LL, string>mp;
int main(){
LL n, m;
scanf("%lld %lld", &n, &m);
int mid = n/2;
for(int i = 0; i < n; i++)scanf("%lld", &a[i]);
for(int i = 0; i < (1<<mid); i++){
LL sum = 0;
string vis;
for(int j = 0; j < mid; j++){
if(((i>>j)&1))sum += a[j], vis.push_back('1');
else vis.push_back('0');
}
mp[sum] = vis;
}
int left = n - mid;
for(int i = 0; i < (1<<left); i++){
LL sum = 0;
string vis;
for(int j = 0; j < left; j++){
if(((i>>j)&1))sum += a[j+mid], vis.push_back('1');
else vis.push_back('0');
}
if(mp.count(m-sum)){
cout<<mp[m-sum]<<vis<<endl;
break;
}
}
return 0;
}