题目链接
AC代码
#include<cstdio>
int hashtable[1000];//hashtable[i]表示数字i出现的次数
int main(){
int n,pay,t;
scanf("%d %d",&n,&pay);//输入硬币数和付款金额
for(int i=0;i<n;i++){
scanf("%d",&t);//输入面值
++hashtable[t];//该面值的硬币出现次数加1
}
for(int i=1;i<501;i++){//从面值为1到500的硬币开始列举
if(hashtable[i]&&hashtable[pay-i]){//付款金额分解的两个面值的硬币都存在
if(i==(pay-i)&&hashtable[i]<=1){//如果两枚硬币面值相同且少于两枚,则失败
continue;
}
printf("%d %d\n",i,pay-i);
return 0;
}
}
printf("No Solution\n");
return 0;
}
此题需要注意的是哈希表应该放在全局数据段中,如果放在函数内会导致栈空间溢出而无法AC,且大小不能小于1000,比如大小设置为500,在枚举硬币时付款金额减当前面值可能会超过500,导致段错误