一道很简单的贪心题。
因为输入的数据都是2的次方,很明显用贪心算法。由于2的次方如果用数组存放出现的次数数组要开得很大,所以我们用map存放。然后从大到小进行判断等操作。
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n,q,t;cin>>n>>q;
map<int ,int > mnt;
while(n--){
cin>>t;
if(!mnt.count(t)) mnt[t] = 0;
mnt[t]++;
}
while(q--){
cin>>t;int cnt = 0,f = 0;
map<int,int>::reverse_iterator it = mnt.rbegin();
for(;it != mnt.rend();it++){
int m = min(t/it->first,it->second); //m为取当前数的最多个数。
t -= m * it->first; //当t如果小于it->first,m为0
cnt += m;
if(!t) {
f = 1;break; //判断t是否为0
}
}
if(f) {
cout<<cnt<<endl;continue;}
cout<<"-1"<<endl;
}
return 0;
}