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;
}
}
动态规划——最少钞票凑出指定金额
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 有不少妹子觉得黑长直才是最美的,但是小编觉得年轻就应该让自己美的独一无二,不止妆容要美,发色也要美到炸。今年最热的...