问题描述:
有1元,5元,10元,50元,100元,500元的硬币各c1,c5,c10,c50,c100,c500枚.现在要用这些硬币来支付A元,最少需要多少枚硬币?假定本题至少存在一种支付方案.
输入:第一行有六个数字,分别代表从小到大6种面值的硬币的个数
第二行为A,代表需支付的A元
样例:输入
3 2 1 3 0 2
620
输出
6
说明:
1500+250+110+25,共6枚
思路分析:
这个问题就存在最优子结构,故可以不断选择硬币值最高的硬币,进而达到整体的最优。要特别注意递归的出口,可能存在硬币数量不够的情况,要记得处理。
具体看代码注释:
import java.util.Scanner;
public class Ybwt {
//硬币问题
public static int yb(int []a,int end,int pay,int [] money)
{
if (end==0)//要注意硬币数目不够的情况
{
if (money[0]*a[0]<pay) {
System.out.println("硬币数目不够");
System.exit(0);
}
else
return pay/money[0];
}//递归出口
if (pay<=0)return 0;
int temp=pay/money[end];//用于记录使用多少个最大值;
int res=Math.min(temp,a[end]);//找到两者的最小值(即为硬币数目)
return res+yb(a,end-1,pay-res*money[end],money);
}
public static void main(String[] args) {
Scanner a=new Scanner(System.in);
int []num=new int[6];//记录各个硬币的数量
for (int i=0;i<6;i++)
num[i]=a.nextInt();
int pay=a.nextInt();//输入需要支付的金额
int []money={1,5,10,50,100,500};//输入各个硬币金额大小
int out=yb(num,5,pay,money);
System.out.println(out);
}
}
运行结果如下: