Algoritmo per trovare il minor numero di valori (da un insieme di valori) dove la somma è uguale a un valore (+ un'altra condizione)

1

Il modo più semplice per spiegarlo è con un esempio.

Ti viene dato il numero 19 e hai una serie di numeri tra cui scegliere: 1, 2, 3, 4, 6

Quando si scelgono i valori dall'elenco (che può essere duplicato), il più piccolo numero di valori che somma fino a 19 è 4 :

6, 6, 6, 1

6, 6, 4, 3

Ora l'elenco di numeri che voglio selezionare è 6, 6, 4, 3 perché quando tracciato su un grafico, disegna un gradiente più fluido che va da numeri più grandi a numeri più piccoli. 6, 6, 6, 1 è un calo improvviso mentre passa dall'ultimo 6 a 1 .

Potrei sbagliarmi (e, per favore, correggimi se è così) ma penso che un modo migliore per esprimere questo desiderio sia scegliere l'elenco in cui il prodotto di ciascuno dei numeri è il valore più grande.

6 * 6 * 6 * 1 = 216

6 * 6 * 4 * 3 = 432 (choose this list)

Un altro esempio è scegliere 4, 3 anziché 6, 1 per un valore di 7 .

Come si può calcolare questo utilizzando un algoritmo (idealmente non brute-force!) da usare con qualsiasi valore totale e un insieme arbitrario di numeri tra cui scegliere?

    
posta Michael Waterfall 19.12.2014 - 18:36
fonte

1 risposta

3

Questo è il problema somma sottoinsieme . Il problema di somma sottoinsieme è NP-completo. In generale la soluzione richiede una ricerca esaustiva, quindi la complessità del tempo di esecuzione è O (2 ^ N) dove N è il numero di valori nel set. In alternativa, se la somma desiderata S è piccola, è possibile utilizzare la programmazione dinamica con una complessità del tempo di esecuzione di O (NS).

    
risposta data 19.12.2014 - 18:51
fonte

Leggi altre domande sui tag