1048. Find Coins

因为涉及的面值在1000以内,所以可以直接用一个长1000的数组保存每个面值情况,随输入随处理,方法如下

#include<iostream>
using namespace std;
int n,has[1003],pay,ret(-1);
int main(){
  scanf("%d%d",&n,&pay);
  for(int i=0,tmp;i<n;++i){
    scanf("%d",&tmp);
    ++has[tmp];
    if(tmp*2==pay&& has[tmp]>1|| tmp*2!=pay&&has[pay-tmp]){
      tmp= min(tmp,pay-tmp);
      if(ret==-1||ret>tmp)ret=tmp;
    }//if
  }//for
  if(ret==-1) printf("No Solution");
  else printf("%d %d",ret,pay-ret);
}
如果面值大到不能用数组保存,就要用哈希,方法如下

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<unordered_set>
using namespace std;
int n,val[100003],pay;
unordered_multiset<int>us;
int main(){
  scanf("%d%d",&n,&pay);
  for(int i=0;i<n;++i) {
    scanf("%d",val+i);
    us.insert(val[i]);}
  sort(val,val+n);
  int i;
  for(i=0;i<n&&val[i]<=pay/2;++i)
    if(val[i]*2==pay&& us.count(pay-val[i])>1|| val[i]*2!=pay&& us.count(pay-val[i])){
      printf("%d %d",val[i],pay-val[i]); break;}
  if(val[i]>pay/2) printf("No Solution");
}
所以方法不一定是固定的




你可能感兴趣的:(1048. Find Coins)