public class Banka {
// Konstanta pouzita na oznacenie, ze sumu nejde vyplatit
public static final int NEDA_SA = -1;
// Nominalne hodnoty cennych papierov
private int[] hodnotyCP;
// Pole, v ktorom budeme generovat pocetnosti jednotlivych typov cennych
// papierov,
private int[] poctyCP;
// Premenna, v ktorej si uchovavame sumu, ktoru nam ostava vyplatit
private int suma;
// Pocet cennych papierov, ktore pouzivame v aktualne generovanom vyplateni
private int pocetCP;
// Najlepsi (najmensi) pocet cennych papierov, ktory sme doposial nasli
private int najPocetCP;
/**
* Ak je zostatkova suma presne 0 (vyskladali sme presne pozadovanu sumu),
* overime, ci aktualne riesenie nie je lepsie ako doposial najlepsie.
*/
private void spracuj() {
if (suma != 0)
return;
if (pocetCP < najPocetCP) {
najPocetCP = pocetCP;
}
}
/**
* Generujeme vsetky mozne vyplatenia sumy pocnuc zadanym indexom (typom
* CP).
*
* @param odIdx
*/
private void generuj(int odIdx) {
if (odIdx == poctyCP.length) {
spracuj();
return;
}
for (int i = 0; i <= suma / hodnotyCP[odIdx]; i++) {
// Skusime generovat vsetky riesenia, v ktorych z CP na indexe odIdx
// pouzijeme presne i kusov
poctyCP[odIdx] = i;
suma -= i * hodnotyCP[odIdx];
pocetCP += i;
// Generujeme...
generuj(odIdx + 1);
// Po preskumani vygenerovanych rieseni obnovime povodny stav pola a
// premennych.
suma += i * hodnotyCP[odIdx];
pocetCP -= i;
poctyCP[odIdx] = 0;
}
}
public int minVyplatenie(int suma) {
this.suma = suma;
pocetCP = 0;
najPocetCP = Integer.MAX_VALUE;
// Generujeme vsetky mozne vyplatenia
generuj(0);
// Ak sme nasli nejake vyplatenie (minimum uz nie je MAX_VALUE), vratime
// pocet inak specialnu informaciu, ze sumu nejde vyplatit.
if (najPocetCP != Integer.MAX_VALUE)
return najPocetCP;
else
return NEDA_SA;
}
public Banka(int[] hodnotyCP) {
this.hodnotyCP = hodnotyCP.clone();
this.poctyCP = new int[hodnotyCP.length];
}
public static void main(String[] args) {
Banka statnaPokladnica = new Banka(new int[] { 100, 500, 800 });
System.out.println(statnaPokladnica.minVyplatenie(1100));
}
}