1. 开始测试点3答案错误,看参考书发现是,读题时根据硬币最大面值500设置的数组大小,但是后来会用总面值减去硬币面值,这个大小在[1,999),因此散列表的大小应该设为1010。
2. 学会了一个小技巧。main函数可以不止一处return 0。这样就不同写一个布尔型判断是否有解了。
3. 另外本题需要考虑到sum = 2*i的情况。因此散列表必须是整型,因为当2个硬币同面值,需要对数量是否达到2进行判断
AC代码
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1010;
const double eps = 1e-3;
int main(){
int hashTable[maxn] = {0};//初始化,所有面值的硬币个数都为0
//读入那些数的时候开始增加硬币的个数
int n,sum,r;
scanf("%d %d",&n,&sum);
for(int i=0;i<n;i++){
scanf("%d",&r);
hashTable[r] ++;
}
for(int i=0;i<min(sum,maxn);i++){
if(hashTable[i]){
if(sum == 2*i){//10 = 5+5的情况
if(hashTable[i]>=2){
printf("%d %d",i,i);
return 0;
}
}else{
if(hashTable[sum-i]){// 10 = 3+7的情况
printf("%d %d",i,sum-i);
return 0;
}
}
}
}
printf("No Solution");
return 0;
}