cuestión Coin
1 yuanes, 5 yuanes, 10 yuanes, 50 yuanes, 100 yuanes, 500 monedas yuanes cada uno C1, C5, C10, C50, C100, C500 piezas.
Ahora utilizar estas monedas a pagar un yuan, requiere un número mínimo de piezas ? la moneda
asumir esta pregunta hay por lo menos un sistema de pago.
0≤ci≤10 ^ 9
0≤A≤10 ^ 9
de entrada:
la primera línea tiene seis cifras, que representan pequeñas a grandes seis tipos de monedas de valor nominal del número de
segundos Comportamiento A, representa la
muestra de A yuan a pagar :
entrada
3 2 1 3 0 2
620
salida
6
Descripción: 1500 + 250 + 110 + 25, un total de 6
Idea:
Mire lo mejor frente a usted, cada vez que se actualiza el número total de recursiones menos el valor nominal máximo de la cantidad de monedas * el valor nominal máximo, la actualización del subíndice del valor nominal máximo.
1 import java.util.Scanner; 2 3 public class Ocho_2 Introducción a la estrategia codiciosa y al problema de pago de monedas { 4 static int [] cnts = new int [6 ]; 5 static int [] monedas = {1,5,10,50,100,500 } ; 6 7 public static void main (String [] args) { 8 Scanner in = new Scanner (System.in); 9 10 for ( int i = 0; i <6; i ++ ) { 11 cnts [i] = in. nextInt (); 12 } 13 int A = in.nextInt (); 14 int res = f (A, 5 ); 15 System.out.println (res); 16 } 17 18 / ** 19 * Intenta usar denominaciones grandes primero, porque no necesitas grandes Si usa más denominaciones pequeñas, no obtendrá la solución óptima 20 * Las denominaciones proporcionadas por las monedas 21 * cnts El número de monedas con denominaciones en la mano 22 * A El número total de pagos 23 * cur Primer punto a la mayor denominación de monedas 24 * / 25 private static int f ( int A, int cur) { 26 if (A <= 0 ) 27 return0 ; 28 if (cur == 0 ) 29 devuelve A; 30 31 int coinValue = monedas [cur]; 32 int x = A / coinValue; // Cuánto coinValue 33 int cnt = cnts [cur]; // Cuando la moneda con el valor anterior tiene cnt 34 int t = Math.min (x, cnt); 35 devuelve t + f (At * coinValue, cur-1 ); 36 37 } 38 }