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;
}
}
网友评论