来看这篇文章的bb们想必很清楚题目了哈哈哈。
我还是简述一下吧!
就是你输入你要兑换的金钱的总值,然后系统给出几种金钱的面值,找出你要兑换的金钱总值可以换成钱的最小张数。
⭐举个例子
你要兑换的金钱总值:4
系统给出的几种金钱面值:1,2,5,7,10
你要兑换的金钱总值可以换成钱的最小张数:2(2张面值为2块钱的钱)
⭐解题思路
本题采用动态规划进行解答。(以例子为依据进行解释)
我们采用递归的方式,先找出组成1块钱所需要的的最小张数,依次组成找到2,3,4块钱的最小张数。
我们可以从例子看出,
组成一块钱所需要的的最小张数为1张,
组成两块钱所需要的的最小张数为1张,
组成三块钱所需要的的最小张数为2张,
组成四块钱所需要的的最小张数为2张.
接下来,请边看代码边看解释。
有疑问可以评论区互动。(有点绕可能需要多看几次)
⭐核心代码(带解释版)
public int find(int[] arr,int[] arr01) {
arr[0]=0;
for(int i=0;i<arr.length;i++){
for (int k : arr01) {
// 我们可以通过已知组成一块钱、两块钱、三块钱的张数来推出组成4块钱的张数
// 数组arr的大小为所要查找的目标(4)+1(数组索引从零开始,所以需要加一),因此这里的数组大小是5,
// 即arr[0]到arr[4]。
// 数组里的元素代表该位置(即0,1,2,3,4,分别表示0块钱,一块钱...)的相应的最小组成张数,除arr[0]初始化为0外(我们明确知道,组成0元所需要的金钱数目都为0)
// 其余元素的值初始化为-1,即arr[1]=-1(此时还不知道组成一块钱所需的最小张数,先暂定为-1),以此类推。
// i表示arr数组里的位置,也表示一块钱,两块钱。。。i等于几代表几块钱
// 数组arr01代表系统给出的一些金钱面值
// i必须大于等于系统给的面值(i>=k)才有机会进行下一步
// arr[i-k]+1:举个例子,比如i为4,k刚好循环到2(系统给出的面值之一),那么此时就要让arr[4-2](代表组成两块钱的最小张数)
// +1(1代表还需要k(此时k值为2)的面值为1张)
// 当i还处于初始化状态(arr[i] == -1)或者i目前所找到的最优解大于arr[i-k]+1(arr[i] > arr[i - k] + 1),就给arr[i]赋新的值。
if (i>=k&&(arr[i] == -1 || arr[i] > arr[i - k] + 1)) {
arr[i] = arr[i - k] + 1;
}
}
}
return arr[arr.length-1];
}
⭐核心代码(简洁版)【两for一if】
public int find(int[] arr,int[] arr01) {
arr[0]=0;
for(int i=0;i<arr.length;i++){
for (int k : arr01) {
if (i>=k&&(arr[i] == -1 || arr[i] > arr[i - k] + 1)) {
arr[i] = arr[i - k] + 1;
}
}
}
return arr[arr.length-1];
}
⭐完整版代码
import java.util.*;
public class 找零钱 {
public int find(int[] arr,int[] arr01) {
arr[0]=0;
for(int i=0;i<arr.length;i++){
for (int k : arr01) {
if (i>=k&&(arr[i] == -1 || arr[i] > arr[i - k] + 1)) {
arr[i] = arr[i - k] + 1;
}
}
}
return arr[arr.length-1];
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入你想要兑换的零钱总值:");
int n=sc.nextInt();
int[] arr=new int[n+1];
Arrays.fill(arr,-1);
System.out.println("我们的零钱面值有:");
int[] arr01=new int[]{1,2,5,7,10};
for (int j : arr01) {
System.out.print(j + " ");
}
System.out.println();
找零钱 z=new 找零钱();
int result=z.find(arr,arr01);
System.out.println("你最少可以兑换到的零钱张数为:"+result);
}
}
⭐运行结果