1、找零钱(找硬币)
有1元、2元、5元三种面值的硬币,求找零N元,最少要找多少张零钱。
解题代码如下。思路采用动态规划思路解决。
/**
* 找硬币问题。有1元、2元、5元三种面值的硬币,求找零N元,最少要找多少张零钱。
* @author zll
* @version 1.0
* @date 2020/6/5 9:54
*/
public class test01 {
public static void main(String[] args) {
int[] arr = {1, 2, 5};
for(int i=-3;i<=30;i++){
int num = i;
int result = caculate01(arr, num);
System.out.println("找零"+num+"元至少需要"+result+"张零钱");
}
}
/**
* 动态规划思想
* @param arr
* @param num
* @return
*/
private static Integer caculate01(int[] arr, int num) {
if (num <= 0) {
return 0;
}
if(num==1||num==2||num==5){
return 1;
}
if(num==3||num==4){
return 2;
}
int F[] = new int[num + 1];
F[0] = 0;
F[1] = 1;
F[2] = 1;
F[3] = 2;
F[4] = 2;
F[5] = 1;
for (int i = 6; i <= num; i++) {
int min = num;
for (int j = 1; j <= i / 2; j++) {
if (min > F[j] + F[i - j]) {
min = F[j] + F[i - j];
}
}
F[i] = min;
}
return F[num];
}
}