#include #include #include "print.hpp" /** * @brief Aggiorna il cambio minimo * * Questa funzione aggiorna il cambio minimo noto usando il cambio * corrente. * * @param minimo è il miglior cambio noto * @param len_minimo è il numero di monete nel miglior cambio noto * @param corrente è il nuovo cambio trovato * @param len_corrente è il numero di monete del nuovo cambio trovato */ void aggiorna_minimo(unsigned int*& minimo, size_t& len_minimo, const unsigned int* corrente, const size_t& len_corrente) { delete[] minimo; len_minimo = len_corrente; minimo = new unsigned int[len_minimo]; for (size_t i=0; i 0 && len_corrente > len_minimo) { // punto 1. // fai backtracking return; } if (valore==0) { // punto 2. aggiorna_minimo(minimo, len_minimo, corrente, len_corrente); return; } if (valore >= tagli[indice_taglio] && monete[indice_taglio]>0) { // punto 3. aggiungi_moneta(minimo, len_minimo, corrente, len_corrente, tagli, num_tagli, monete, valore, indice_taglio); } if (indice_taglio+1 T trova_min(const T A[], const size_t len) { T min_value = A[0]; for (size_t i=1; i A[i]) { min_value = A[i]; } } return min_value; } /** * @brief Cambia un valore in monete * * @param[out] len_cambio è la lunghezza del minimo cambio trovato * @param[in] tagli è l'array dei tagli di monete disponibili nel cambia monete * @param[in] num_di_tagli è il numero di tagli nel cambia monete * @param[in] monete è il numero di monete per ogni taglio * @param[in] valore è il valore da cambiare * @return Il cambio migliore per valore */ std::unique_ptr cambia(size_t& lunghezza_cambio, const unsigned int tagli[], const size_t& num_tagli, unsigned int monete[], const unsigned int& valore) { // inizializzazione del minimo trovato // fino a questo punto unsigned int* minimo = nullptr; lunghezza_cambio = 0; unsigned int min_tagli = trova_min(tagli, num_tagli); unsigned int max_monete = valore/min_tagli + 1; // cambio del valore già cambiato unsigned int* corrente = new unsigned int[max_monete]; size_t len_corrente = 0; trova_cambio(minimo, lunghezza_cambio, corrente, len_corrente, tagli, num_tagli, monete, valore, 0); delete[] corrente; return std::unique_ptr{minimo}; } int main() { unsigned int tagli[] = {1, 29, 100}; unsigned int monete[] = {30, 4, 2}; size_t len_cambio; auto cambio = cambia(len_cambio, tagli, 3, monete, 117); println(cambio.get(), len_cambio); return 0; }