菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
372
0

硬币找零

原创
05/13 14:22
阅读数 88232

/*
* 硬币找零:三个硬币面值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];
  }
}

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

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

发表评论

0/200
372 点赞
0 评论
收藏