硬币找零

/*
* 硬币找零:三个硬币面值2,5,7,希望用最少的硬币数拼出27
* 分析:用动态规划解
* f[X]:最少的硬币拼出X,设最后一步用a拼出了27,a可以是2/5/7,那么
* f[27]=f[27-a]+1,因为不知道a具体是多少,所以,f[27]=min{f[27-2]+1,f[27-5]+1,f[27-7]+1},
* 扩展:f[X]=min{f[X-2]+1,f[X-5]+1,f[X-7]+1}
*/

public class test {

  public static void main(String[] args) {
    int[] a = {2,5,7};
    int c= getMinCoins(a, 27);
    System.out.println(c);
  }

  public static int getMinCoins(int[] a,int b){//a是2,5,7的数组,b是27
    int[] f = new int[b+1];
    f[0] = 0;
    for (int i = 1; i <= b; i++) {
      f[i] = Integer.MAX_VALUE;
      for (int j = 0; j < a.length; j++) {
        if(i >= a[j] && f[i-a[j]] != Integer.MAX_VALUE){
          f[i] = Math.min(f[i-a[j]]+1,f[i]);
        }
      }
    }
    if(f[b] == Integer.MAX_VALUE){
      f[b] = -1;
    }
    return f[27];
  }
}

多说一句,贪心算法会重复计算,时间复杂度可能会挺高;

这是本人的一些想法,若是有更好的想法,可以互相探讨,若是有错误,尽情指出!

posted @ 2021-04-15 19:42  RookieLwh  阅读(69)  评论(0编辑  收藏  举报