【题意】
给出一些硬币币值和一个需要支付的总价,判断是否能用两个硬币支付,能的话输出较小币值最小的组合
【思路】
用个map<int,int>存下有的硬币币值的个数,然后对于不超过总价一半的币值从小到大遍历,找到第一个满足a和m-a两种币值都存在或2*a等于总价且a有至少两个的币值,输出即可,找不到就输出"No Solution"
#include <iostream>
#include <map>
using namespace std;
int main(int argc, char const *argv[])
{
map<int,int> coins;
int n,m;
cin >> n >> m;
for(int i=0; i<n; i++){
int num;
cin >> num;
if(coins.find(num)==coins.end()){
coins[num] = 1;
}
else{
coins[num]++;
}
}
for(map<int,int>::iterator it=coins.begin(); it!=coins.end() && (*it).first*2<=m; it++){
if(((*it).first*2==m && (*it).second>=2) || ((*it).first*2<m && coins.find(m-(*it).first)!=coins.end())){
cout << (*it).first << " " << m-(*it).first;
system("pause");
return 0;
}
}
cout << "No Solution";
system("pause");
return 0;
}