题意:
给你n个硬币,每个硬币的大小为ai,ai为2的次幂
你需要买一个价值为b的商品,问能否凑成b,如果可以,输出凑成的最少硬币数量
思路:
按照面值从大到小进行贪心
遇到一个面值ai,选择min( cnt[ai] (可以提供的面值为i的硬币数量) 和 b/ai(当前b需要的最多面值为i的硬币数量))
ans+=min
b-=min*ai
用map记录硬币面值次数
#include <cstdio>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <map>
#include <iostream>
#define ll long long
#define INF 0x3f3f3f
using namespace std;
const int N=1000000+100;
map<int ,int > mp;
int main()
{
int n,q,i,x,ans,temp;
scanf("%d%d",&n,&q);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
mp[x]++;
}
while(q--)
{
ans=0;
scanf("%d",&x);
for(i=1<<30;i>=1;i/=2)
{
temp=min(mp[i],x/i);// mp[i]是可以提供的面值为i的硬币数量 x/i是当前x需要的最多面值为i的硬币数量 选最小的
ans+=temp;
x-=i*temp;
}
if(x==0) printf("%d\n",ans);
else printf("-1\n");
}
return 0;
}