概述
题目:
这道题我是使用动态规划做的,只不过代码写的没有答案简洁。
这题思路还是很清晰的。
对于每一个金额,都会去枚举去掉CONIS数组里的某个金额所需要的总数
比如1,3,5,目标为11
遍历到7时,就会去比较F(6)+1,F(4)+1,F(2)+1,看由哪条路线构成当前金额用的最少。
递推公式为:j用来列举conis数组里的元素
dp[i] = min(dp[i],dp[i-coins[j]]+1);
C++代码(附带测试):
#include<iostream>
#include<Math.h>
#include<algorithm>
#include<vector>
using namespace std;
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
int n = amount +1;
int dp[n];
for(int i=0;i<=amount;i++){//如果在上一行初始化这样只会让第一个值为amount+1,其它为0,所以要使用循环赋值
dp[i] = n;
}
dp[0] = 0;
for(int j=0;j<coins.size();j++){
if(coins[j]<=amount){//只初始化在范围内的值
dp[coins[j]] = 1;
}
}
for(int i=0;i<=amount;i++){
for(int j=0;j<coins.size();j++){
if(i-coins[j]>0){
dp[i] = min(dp[i],dp[i-coins[j]]+1);
}
}
}
if(dp[amount] > amount){
return -1;
}else{
return dp[amount];
}
}
};
//题解的代码太简洁优雅了,不像我的一堆判定条件
//class Solution {
//public:
// int coinChange(vector<int>& coins, int amount) {
// int Max = amount + 1;
// vector<int> dp(amount + 1, Max);
// dp[0] = 0;
// for (int i = 1; i <= amount; ++i) {
// for (int j = 0; j < (int)coins.size(); ++j) {
// if (coins[j] <= i) {
// dp[i] = min(dp[i], dp[i - coins[j]] + 1);
// }
// }
// }
// return dp[amount] > amount ? -1 : dp[amount];
// }
//};
//
//作者:LeetCode-Solution
//链接:https://leetcode-cn.com/problems/coin-change/solution/322-ling-qian-dui-huan-by-leetcode-solution/
//来源:力扣(LeetCode)
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
int main(){
vector<int> coins = {1};
int amount = 1;
Solution solution;
cout<<solution.coinChange(coins,amount);
}
最后
以上就是傻傻水杯为你收集整理的【LeetCode刷题笔记-86 322:零钱兑换(动态规划)】的全部内容,希望文章能够帮你解决【LeetCode刷题笔记-86 322:零钱兑换(动态规划)】所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复