题目: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;
}

posted on 2019-08-16 15:18  Refused  阅读(65)  评论(0编辑  收藏  举报