找零钱
题目:已知一些不同面值的钞票与一个金额,求如何用最少数量的钞票组成该金额,
如果任意数量的已知面值都无法组成该金额,返回-1
//找零钱
//题目:已知一些不同面值的钞票与一个金额,求如何用最少数量的钞票组成该金额,
//如果任意数量的已知面值都无法组成该金额,返回-1。
#include<iostream>
#include<vector>
using namespace std;
class Solution
{
public:
int coinChange(vector<int>&coins,int amount)
{
//初始化数组dp,存放每个金额的最少钞票数
//大小为amount+1
vector<int>dp(amount+1,-1);
dp[0]=0;
for(int i=1;i<=amount;i++)
//变量i依次计算每个金额的最优解
{
for(int j=0;j<coins.size();j++)
//对于每个金额i,使用j遍历面值coins数组
{
if(coins[j]<=i&&dp[i-coins[j]]!=-1)
//对于小于等于i的面值coins[j],金额i-coins[j]有最优解
{
if(dp[i]==-1||dp[i]>dp[i-coins[j]]+1)
//如果当前金额还未计算或dp[i]比正在计算的最优解大
{
dp[i]=dp[i-coins[j]]+1;//更新dp[i]
}
}
}
}
return dp[amount];
}
};
int main()
{
int n,v,temp;
cout<<"请输入面值数量和目标金额:"<<endl;
cin>>n>>v;
vector<int>coins;
cout<<"请输入全部面值:"<<endl;
for(int i=0;i<n;i++)
{
cin>>temp;
coins.push_back(temp);
}
Solution solution;
cout<<solution.coinChange(coins,v)<<endl;
return 0;
}
。