package com.hanzheng.algorithm;
import java.util.Arrays;
public class ComposeChange {
static int[] mem;
public static void main(String[] args) {
int[] coins = new int[]{3, 9, 5};
int total = 11;
mem = new int[total + 1];
Arrays.fill(mem, -888);
int minCount = dp(coins, total);
System.out.println(minCount);
}
private static int dp(int[] coins, int total) {
if (total == 0) {
return 0;
}
// 回溯点1,试探到最后失败,开始回溯
if (total < 0) {
return -1;
}
// 没有碰到失败回溯点代表要继续尝试,但是在尝试之前可以看看之前是否已经尝试过
// 如果这次尝试已经完成过,就直接返回,不再向下试探
if(mem[total]!=-888){
return mem[total];
}
int count = Integer.MAX_VALUE;
// 每一次尝试都会面临三种选择
for (int i = 0; i < coins.length; i++) {
int subProblem;
// 一直在向下试探,直到最后碰到base case开始回溯
// 由于mem[total]没有记录,证明这次尝试没有被完成过,所以继续向下试探
subProblem = dp(coins, total - coins[i]);
// 一旦返回代表这次尝试结束得到结果
if (subProblem == -1) {
// 如果进入到了失败回溯点,这里结束循环进入到下一条路径下进行尝试
continue;
}
count = Math.min(count, subProblem + 1);
}
// 尝试逻辑不再向下递归,走到了这里证明这次尝试完成了,记录一下这次尝试的值
mem[total] = count == Integer.MAX_VALUE ? -1 : count;
// 回溯点2,试探成功开始回溯
return mem[total];
}
}
找零钱算法题目笔记
于 2022-07-06 13:32:39 首次发布