题目描述
-
有1元,5元,10元,50元,100元,500元的硬币各c1,c5,c10,c50,c100,c500枚.现在要用这些硬币来支付A元,最少需要多少枚硬币?
-
限制条件:0≤ C1,C5,C10,C50,C100,C500≤1000000000,0≤A≤1000000000
-
输入描述:依次输入C1,C5,C10,C50,C100,C500和A,以空格分隔
-
输出描述:输出最少所需硬币数,如果该金额不能由所给硬币凑出,则返回NOWAY
算法思想
贪心:每次尽可能的多选择可使用的最大面值,直到没有钱or没有硬币可以表示
代码
static int count=0;
static int reaminMoney;
public static void main(String[] args) {
int[] coins= {1,5,10,50,100,500};
int[] coinNum=new int[6];
Scanner scanner=new Scanner(System.in);
for (int i = 0; i < 6; i++) {
coinNum[i]=scanner.nextInt();
}
int money=scanner.nextInt();
reaminMoney=money;
solve(coins,coinNum,5);
}
private static void solve(int[] coins, int[] coinNum, int cur) {
if(reaminMoney==0) {
System.out.println(count);
System.exit(0);
}
if(cur==0) {
if(reaminMoney>coinNum[cur]) {
System.out.println("NOWAY");
System.exit(0);
}else {
count+=reaminMoney;
System.out.println(count);
System.exit(0);
}
}
int n=reaminMoney/coins[cur];
int min=minOf(n,coinNum[cur]);
reaminMoney -= min*coins[cur];
count+=min;
solve(coins, coinNum, --cur);
}
private static int minOf(int n, int i) {
if(n>=i) {
return i;
}else {
return n;
}
}