Tabla de contenido
Resultados de la ejecución del algoritmo y análisis de la complejidad del tiempo de cálculo
Descripción del problema:
Hay varias monedas de 1 céntimo, 2 céntimos, 5 céntimos, 10 céntimos, 50 céntimos y 100 céntimos. Ahora quieres usar estas monedas para pagar W yuan. Diseña un algoritmo codicioso para completarlo con la menor cantidad de monedas posible . Comportamiento de pago. Hay varias monedas de 1 céntimo, 2 céntimos, 5 céntimos, 10 céntimos, 50 céntimos y 100 céntimos. Ahora quieres usar estas monedas para pagar W yuan. Diseña un algoritmo codicioso para completarlo con la menor cantidad de monedas posible . Comportamiento de pago.
Ideas de diseño de algoritmos:
Diseñe un bucle for para realizar operaciones, y la cantidad de bucles está realmente vinculada a la cantidad de hojas. Establezca la condición, si ww>arr[i] (la denominación más grande actualmente aceptada), i-- no se ejecutará, tal vez la denominación se pueda reducir una vez. Si no se puede reducir, ejecute i--, deje que lo intente la siguiente denominación más pequeña, y así sucesivamente. Finalmente, si ww=0, el resultado se puede mostrar.
Código:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
double w = sc.nextDouble();
int ww = (int)(w*100);//把元单位转换为分
int arr[] = new int[6];
for (int i = 0; i < 6; i++) {//输入硬币的几种面额
int a = sc.nextInt();
arr[i] = a;
}
// Arrays.sort(arr);//若是乱序,则需要排序
int num = 0;//存储使用张数
for (int i = 5; i >= 0;) {//因为排序默认从小到大,所以这里要从后往前
if (ww >= arr[i]) {
ww = ww - arr[i];
// i++;
num++;//每使用一张,加1
} else {
i--;//把i--安排在这里,上面只要最大的面额还能用,就不减;不能用了,就执行i--
}
if (ww == 0) {
System.out.println(num);//输出张数
break;
}
}
}
}
}
Resultados de la ejecución del algoritmo y análisis de la complejidad del tiempo de cálculo:
Si se requiere ordenar, la complejidad del tiempo es T(n)=O(nlogn)
Si no se requiere clasificación, la complejidad del tiempo es T(n)=O(n)