版权声明: https://blog.csdn.net/dickdick111/article/details/84260350
题目链接:322. Coin Change
题目大意:给出硬币的面值以及所需要的总金额,试图找到最少个数的找钱方式,这里假设硬币的个数都是无限个。
注意点:
1.可能存在无法找零的情况,注意判断。
2.注意动态规划数组的下标是从1开始还是从0开始
一.算法设计
这道也是典型的动态规划题目,不能使用贪心算法来解决。
设置数组dp[i],表达找零总额为i的最少硬币总数。
注意初始化给每一个金额先赋值为MAX值,方便后面判断是否没有找零的情况。
状态转移方程:dp[i] = min(dp[i], dp[i-coins[j]]+1);
表达为遍历所拥有的硬币,查找需要该硬币的前一个dp值+1后是否小于当前dp值,如果是则更换dp值。始终保持dp为当前金额的最小硬币数
判断是否无法找零,是通过对于最后的dp值,如果仍等于MAX值,则证明没有办法找到一个方案找零,返回-1.
二.算法实现
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount+1);
int csize = coins.size();
for(int i = 1; i <= amount; i++) dp[i] = 10000;
for(int i = 1; i <= amount; i++){
for(int j = 0; j < csize; j++){
if(i >= coins[j])
dp[i] = min(dp[i], dp[i-coins[j]]+1);
}
}
if(dp[amount] == 10000) return -1;
else return dp[amount];
}
};