题目链接:1.取钱 - 蓝桥云课 (lanqiao.cn)
用动态规划的方法,定义一个dp数组,存放从0开始的取钱所需要的钞票数(0就是取0元,所以钞票数也是0)
package lanqiao;
import java.util.Arrays;
import java.util.Scanner;
/**
* 2023/11/30
*/
public class lanqiao3297_取钱 {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int[] a={1,4,5,10,20};//纸币面额
int[] dp=new int[(int)1e5+1];//取出的金额
Arrays.fill(dp, (int) 1e9);//全部赋值为最大值,方便和小值比较交换
dp[0]=0;//要取出的金额为0时,给出的钞票数也为0
for (int i=1;i<dp.length;i++){
for (int j=0;j<a.length;j++){
if (i>=a[j]){//如果要取出的金额大于纸币面额,则取这些钱需要总钱数减去纸币面额在加1(因为有这么大面额的纸币)
dp[i]=Math.min(dp[i],dp[i-a[j]]+1);//***********关键*************
}
}
}
while (scan.hasNextInt()){//输入取出金额
int x=scan.nextInt();
System.out.println("最少需要的钞票数为:"+dp[x]);
}
}
}
6
最少需要的钞票数为:2
20
最少需要的钞票数为:1
2
最少需要的钞票数为:2