给n,m以及n个硬币
问,是否存在两个硬币面值v1+v2=m
因为面值不会超过500,所以实际上最多500个不同的硬币而已
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h> using namespace std; const int maxn=100000+5; int coin[maxn]; int n,m; int main() { scanf("%d %d",&n,&m); for(int i=0;i<n;i++){ scanf("%d",&coin[i]); } sort(coin,coin+n); int cnt=0; int tmp[maxn]; tmp[cnt++]=coin[0]; int num[maxn]; //统计该硬币出现的次数,因为可能m=a+a //因为硬币的大小不会超过500,所以实际上最多有500个不同的硬币 for(int i=1;i<n;i++){ if(coin[i]!=coin[i-1]){ num[cnt]++; tmp[cnt++]=coin[i]; } else{ num[cnt-1]++; } } bool flag=false; for(int i=0;i<cnt;i++){ int j=num[i]>=2?i:i+1; for(;j<cnt;j++){ if(tmp[i]+tmp[j]==m){ printf("%d %d ",tmp[i],tmp[j]); flag=true; break; } } if(flag) break; } if(!flag) printf("No Solution "); return 0; }