dede本地搭建好网站后台密码和用户名是什么,最专业企业营销型网站建设,网站承接广告宣传方案,临沂网站建设方案服务给你一个整数数组 coins #xff0c;表示不同面额的硬币#xff1b;以及一个整数 amount #xff0c;表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额#xff0c;返回 -1 。
你可以认为每种硬币的数量是无限的。 示…给你一个整数数组 coins 表示不同面额的硬币以及一个整数 amount 表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额返回 -1 。
你可以认为每种硬币的数量是无限的。 示例 1
输入coins [1, 2, 5], amount 11
输出3
解释11 5 5 1
示例 2
输入coins [2], amount 3
输出-1
示例 3
输入coins [1], amount 0
输出0提示
1 coins.length 121 coins[i] 231 - 10 amount 104
这题还是有点儿难度的刚开始我想的是直接用回溯来做虽然代码超时了但是这里也附上我的代码以儆效尤~ void traverse(vectorint coins,int amount,long long sum,int temp){if(sumamount) return;for(int i0;icoins.size();i){sumcoins[i];temp;if(sumamount){minlmin(minl,temp);}traverse(coins,amount,sum,temp);sum-coins[i];temp--;}}int coinChange(vectorint coins, int amount) {if(amount0)return 0;traverse(coins,amount,0,0);return minlINT_MAX?-1:minl;}
结果不出意外出意外额~ 看了一下数据量发现用回溯来做确实不太行好果断改策略改用动态规划~ int coinChange(vectorint coins, int amount){if(coins.size()0)return -1;vectorint dp(amount1,amount1);dp[0]0;for(int i1;iamount;i){for(int j0;jcoins.size();j){if(i-coins[j]0){dp[i]min(dp[i],dp[i-coins[j]]1);}}}return dp[amount]amount1?-1:dp[amount];}
运行ok过了~
这题用动态规划可能还是有点儿难度一刚开始我还在想状态方程怎么用在coins数组上后来借鉴了一下别人的思路用在amount上可能更容易写一点好吧我承认我是垃圾~
看了代码还是存在疑问的宝子可以评论区留言哦私我也行我们共同成长~