题目: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;
}
本文探讨了一道关于背包加密系统的题目,该题目要求找出一组数中哪些数的组合可以构成给定的目标数。文章介绍了使用折半搜索策略解决大规模数据集的方法,通过将数据集分为两半并分别进行暴力搜索,有效地避免了超时问题。
1万+

被折叠的 条评论
为什么被折叠?



