senza aver esaminato ciascuna possibilità, tranne il primo 20+ valori e massimo e minimo di valori:
mia aspettativa è
i primi 12 voci nella arr [] sono pre-calcolate per aiutare ridurre la profondità di una ricorsione, tuttavia il valore in dollari non è lo stesso del valore calcolato per le prime 12 voci.
per valori monete < = 49999, verificare se il valore è già calcolato, in caso contrario, quindi rompere la moneta nei valori/2/3/4 e recedere ciascuno di quei valori risultanti.
Questo valore limite (49999) potrebbe essere esteso a 100000 poiché è la dimensione disponibile dell'array arr [].
la preimpostazione e il salvataggio nell'array arr [] servono a ridurre il tempo di esecuzione e la profondità della ricorsione.
l'utilizzo dell'array è tale che qualsiasi valore precedentemente calcolato (nel codice postato, fino a 49999) può essere immediatamente restituito dalla funzione max()
, senza ulteriore ricorsione.
vorrei modificare il codice un po 'per una migliore documentazione e la robustezza e l'esecuzione più veloce come segue:
#include <stdio.h>
#include <stdint.h>
#define MAX_ARRAY_LEN (100000)
uint32_t arr[ MAX_ARRAY_LEN ] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
uint32_t max(uint32_t n)
{
if(n < MAX_ARRAY_LEN)
{ // value of 'n' within the range of the learning array arr[]
if(!arr[n] && n)
{ // then learning array arr[] not yet set
return arr[n] = max(n/2) + max(n/3) + max(n/4);
}
else
{ // else learning array arr[] already set for 'this' value of 'n'
return arr[n];
}
}
else
{ // value of 'n' is greater than the learning array arr[]
return max(n/2) + max(n/4) + max(n/3);
}
} // end function: max
int main(void)
{
uint32_t n;
int status;
while((status = scanf("%u", &n)) == 1 && EOF != status)
{
if(1000000000 >= n)
{
printf("%u\n", max(n));
}
else
{
printf(" invalid value entered, must be in the range 0...1 000 000 000\n");
} // end if
} // end while
return 0;
} // end function: main
gamma di valore. –
@SouravGhosh Perché 49999 in particolare? –
Ti suggerisco di prendere 50000 e calcolare manualmente cosa accadrà nell'array. –