Problema interessante.
Non ho scritto alcun codice, ma ecco i miei pensieri. Non sono stato in grado di
pensa ad un approccio al di là della forza bruta, con un po 'di "potatura".
Utilizzare una rappresentazione RPN è la strada da percorrere, in quanto semplifica la gestione
di parentesi (come tali, vanno via). Usando il tuo esempio, l'RPN è
1 5. 3. 4.
dove ogni '.' è un luogo in cui potrebbe essere un operatore, ad eccezione di
al massimo '.' dove sappiamo che ci deve essere uno o più operatori, perché
è RPN. Ogni altro '.' ha zero o più operatori. Per i valori N devi
avere operatori N-1, ovviamente.
Ora il problema si divide in queste parti:
1. Genera tutte le combinazioni di operatori N-1 (2 ^ N)
2. Per ogni combinazione di operatori, generare tutti i "riempimenti" dell'operatore
punti '.', cioè raggruppare l'elenco degli operatori per 1s, 2s, ..., N-1s, mantenendo
l'ordine dell'operatore (il mio combinatorics-fu è debole, non riesco a capirlo)
3. Per ciascuna combinazione di combinazioni, valuta l'espressione
L'eliminazione avviene nell'ultimo passaggio. Come valuti, se l'espressione
il valore va oltre il risultato desiderato, si ferma con un errore, in quanto non ci sono
operatori che potrebbero ridurre il valore dell'espressione.