【题意】
这题是1048题的扩展,能用的硬币数可以不只是两枚,币值和必须跟给定价钱相等
【思路】
用map<int,int>存下每个币值的硬币数,然后从小往大试即可。有点类似于DFS
#include <iostream>
#include <stack>
#include <map>
using namespace std;
map<int,int> coins;
stack<int> res;
bool findCoins(int value){
for(map<int,int>::iterator it=coins.begin(); it!=coins.end() && (*it).first<=value; it++){
if((*it).second){
coins[(*it).first]--;
if((*it).first==value){
res.push((*it).first);
return true;
}
else if(findCoins(value-(*it).first)){
res.push((*it).first);
return true;
}
else{
coins[(*it).first]++;
}
}
}
return false;
}
int main(int argc, char const *argv[])
{
int n,m;
cin >> n >> m;
for(int i=0; i<n; i++){
int num;
cin >> num;
if(num<=m){
coins[num]++;
}
}
if(findCoins(m)){
bool first = true;
while(!res.empty()){
if(first){
first = false;
}
else{
cout << " ";
}
cout << res.top();
res.pop();
}
}
else{
cout << "No Solution";
}
system("pause");
return 0;
}