E aí pessoal! Queria uma opinião da galera mais ligada na matemática aqui
Tenho o seguinte problema: meu programa deve receber um vetor com 1 a 10 posições, onde cada uma representa o valor de uma moeda, ou nota de um sistema monetário qualquer. Pode ser qualquer valor, e é aí que está o problema…
Preciso testar quantos e quais valores entre 1 e 10000 que não poderão ser pagos com esse sistema monetário, utilizando as moedas necessárias para formar um valor. É parecido com o problema do caixa eletrônico, com a diferença que muitas vezes não será possível pagar algum valor. Eu tenho o código abaixo, o problema é que ele deixa passar alguns valores, como se eles não pudessem ser pagos. O problema é que não consigo pensar em outra forma boa e eficiente de resolver o problema, e sendo uma atividade da cadeira de complexidade de algoritmos, precisa ser um programa rápido, levando menos de um minuto pra rodar.
’’'
import java.sql.Date;
import java.text.SimpleDateFormat;
public class QuartoDesafioFinal {
private static int valoresDeMoedas[] = {5, 11, 13};
private static int valoresAPagar = 10000;
private static int numerosATestar[] = new int[valoresAPagar];
public static void main(String[] args) {
//processo de ordenação do vetor de moedas
//valoresDeMoedas = quickSort(valoresDeMoedas, 0, valoresDeMoedas.length - 1);
int numerosImpossiveis[] = new int[valoresAPagar];
int valorSobra;
int indice;
int j = 0;
int valorInicial;
long inicio = System.currentTimeMillis();
for (int n = 0; n < numerosATestar.length; n++) {
numerosATestar[n] = n + 1;
}
for (int aNumerosATestar : numerosATestar) {
valorSobra = aNumerosATestar;
valorInicial = valorSobra;
indice = valoresDeMoedas.length - 1;
while (indice >= 0) {
if (valorSobra >= valoresDeMoedas[indice]) {
valorSobra -= valoresDeMoedas[indice];
} else {
indice--;
}
}
if (valorSobra > 0) {
numerosImpossiveis[j] = valorInicial;
j++;
}
}
System.out.println("Quantidade de números impossíveis de pagar: " + (j) + "\n");
System.out.println("Os seguintes números não poderão ser pagos com a moeda da Teluria:");
for (int numerosImpossivei : numerosImpossiveis) {
if (numerosImpossivei > 0) {
System.out.println(numerosImpossivei);
}
}
long fim = System.currentTimeMillis();
System.out.println("\nTempo decorrido:");
System.out.println(new SimpleDateFormat("ss.SSS").format(new Date(fim - inicio)));
}
‘’’