[leetcode/lintcode 题解] 字节跳动面试题:换硬币

给出不同面额的硬币以及一个总金额. 写一个方法来计算给出的总金额可以换取的最少的硬币数量. 如果已有硬币的任意组合均无法与总金额面额相等, 那么返回 ​-1​.   在线评测地址:领扣题库官网   样例1 输入: [1, 2, 5] 11 输出: 3 解释: 11 = 5 + 5 + 1 样例2 输入:  [2] 3 输出: -1   题解 这是一个典型的完全背包问题,在动态规划专题班中侯卫东老师有详细讲解。
  设dpi表示使用前i个硬币,总金额为j时需要的最少硬币数量。 dp[i][j]=max(dp[i−1][j],dp[i−1][j−k∗coin[i]]+k)(0≤k∗coin[i]≤j)   public class Solution {     public int coinChange(int[] A, int M) {         int[] f = new int[M + 1];         int n = A.length;                  f[0] = 0;         int i, j;         for (i = 1; i <= M; ++i) {             f[i] = -1;             for (j = 0; j < n; ++j) {                 if (i >= A[j] && f[i - A[j]] != -1) {                     if (f[i] == -1 || f[i - A[j]] + 1 < f[i]) {                         f[i] = f[i - A[j]] + 1;                     }                 }             }         }                  return f[M];     } }   更多题解参考:九章官网solution
上一篇:Leetcode 185: Department Top Three Salaries


下一篇:读书报告