美文网首页
动态规划——最少钞票凑出指定金额

动态规划——最少钞票凑出指定金额

作者: 阿福德 | 来源:发表于2019-08-29 11:04 被阅读0次
    package com.karl.study;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class DynamicMoney {
        public static Map<Integer, Integer> cache = new HashMap<>();
        public static void main(String[] args) {
            //面额
            int[] money = {1,5,4};
            int pay =17;
    
            try {
                System.out.println(dp(money, pay));
            }catch (RuntimeException e) {
                System.out.println(e.getMessage());
            }
        }
    
        //这个方法实现不正确
        private static int dp(int[] money, int pay) {
            if(cache.containsKey(pay)) {
                System.out.println("from cache :" + pay+" "+ cache.get(pay));
                return cache.get(pay);
            }
            if(contains(money, pay)){
                return 1;
            }
            List<Integer> list = new ArrayList<> (money.length);
            for(int m : money) {
                if(pay>m) {
                    int b = pay / m;
                    int res;
                    if (pay - m * b > 0) {
                        res = dp(money, pay - m * b);
                         if (!cache.containsKey(pay - m * b)) {
                              cache.put(pay - m, res);
                        }
                        res = res +b;
                    }else {
                        res = b;
                    }
                   
                    list.add(res);
                }
            }
            if(list.size() == 0){
                throw new RuntimeException("no result.");
            }
            //所有的组合中得到一个最小的。
            return list.stream().sorted().findFirst().get();
        }
    
        private static int dp2(int[] money, int pay) {
            if(cache.containsKey(pay)) {
                System.out.println("from cache :" + pay+" "+ cache.get(pay));
                return cache.get(pay);
            }
            if(contains(money, pay)){
                return 1;
            }
            List<Integer> list = new ArrayList<> (money.length);
            for(int m : money) {
                if(pay>m) {
                int res = dp(money, pay - m );
                    if (!cache.containsKey(pay - m)) {
                        cache.put(pay - m, res);
                    }
                    res = res +1;
                    list.add(res);
                }
            }
            if(list.size() == 0){
                throw new RuntimeException("no result.");
            }
            //所有的组合中得到一个最小的。
            return list.stream().sorted().findFirst().get();
        }
    
        private static boolean contains(int [] money, int pay) {
            for(int m : money) {
                if(pay == m){
                    return true;
                }
            }
            return false;
        }
    }
    

    相关文章

      网友评论

          本文标题:动态规划——最少钞票凑出指定金额

          本文链接:https://www.haomeiwen.com/subject/pdobectx.html