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

2019-08-29  本文已影响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;
    }
}
上一篇下一篇

猜你喜欢

热点阅读