题目:
这道题我是使用动态规划做的,只不过代码写的没有答案简洁。
这题思路还是很清晰的。
对于每一个金额,都会去枚举去掉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++代码(附带测试):
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71#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内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复