思路若隐若现,写起来很痛苦,最后去看题解,发现问题出在自己是从0到amount,而题目是从amount到0,而且加上了不同路径求min个数的步骤,用记忆数组来存储已经得到的结果。仔细想想,好像从0到amount也可以,比如从0到amount可以退化成0到amount-coin,然后接着退化,直到当前值小于等于0,其实是一样的。自己的做法其实是缺少了最小值这一步,很关键,贴代码
class Solution { public: vector<int> res; int generate(vector<int>& coins,int amount) { if(amount<0) return-1; if(amount == 0) return 0; if(res[amount] != 0) return res[amount]; int min = INT_MAX; for(auto coin:coins) { int res_temp = generate(coins,amount-coin); if(res_temp<min && res_temp>=0) { min = res_temp + 1; } } res[amount] = min == INT_MAX?-1:min; return res[amount]; } int coinChange(vector<int>& coins, int amount) { if(amount<1) return 0; res.resize(amount+1); return generate(coins,amount); } };
标准动态规划的方法,还是使用自顶向下的方法,状态转移方程也不难搞,因为之前没处理过min这个条件,所以遇到了一些困难,贴代码
1 class Solution { 2 public: 3 int coinChange(vector<int>& coins, int amount) 4 { 5 int max = amount+1; 6 vector<int> res(amount+1,max); 7 res[0] = 0; 8 for(int i = 1 ; i <= amount ; i++) 9 { 10 for(auto temp:coins) 11 { 12 if(i>=temp) 13 { 14 res[i] = min(res[i],res[i-temp]+1); 15 } 16 } 17 } 18 return res[amount] > amount?-1:res[amount]; 19 } 20 };