硬币支付问题

硬币问题(贪心)

有1元,5元,10元,50元,100元,500元的硬币各c1,c5,c10,c50,c100,c500枚.
现在要用这些硬币来支付A元,最少需要多少枚硬币?
假定本题至少存在一种支付方案.
0≤ci≤10^9
0≤A≤10^9
输入:
第一行有六个数字,分别代表从小到大6种面值的硬币的个数
第二行为A,代表需支付的A元
样例:
输入
3 2 1 3 0 2
620
输出
6

package _90贪心;
import java.util.Scanner;

public class 硬币问题 {
	 static int[]cnts=new int[6];//定义存储硬币的种类的个数
	 static int[]coins= {1,5,10,50,100,500};//定义硬币面值
public static void main(String[] args) {
	Scanner in=new Scanner(System.in);
	for(int i=0;i<6;i++) {
		cnts[i]=in.nextInt();//存入硬币的种类的个数
	}
	int A=in.nextInt();//输入要凑的钱
	
	int res=f(A,5);//传入要凑的钱和最大面值的下标
	System.out.println(res);
}//尽量先用大面值,因为不用大面值,将使用更多的小面值硬币,一定得不到最优解
private static int f(int A, int cur) {
	// TODO Auto-generated method stub
	if(A<=0) {//输入要凑的钱
		return 0;
	}
	if(cur==0) {//或者没有硬币
		return A;
	}
	int coinValue=coins[cur];//用最大面值的下标
	int x=A/coinValue;//当前面值的硬币有cnt个
	int cnt=cnts[cur];
	int t=Math.min(x, cnt);
	return t+f(A-t*coinValue,cur-1);//用t个当前面值,剩下的继续处理
}
}

猜你喜欢

转载自blog.csdn.net/weixin_45952706/article/details/107921817