Nel caso generale, dove i valori della moneta può essere arbitraria, il problema si sta presentando è chiamato Knapsack Problem, ed è noto per appartenere a NP-completa (Pearson, D. 2004), in modo quindi non è risolvibile in tempo polinomiale come la programmazione dinamica.
Prendere l'esempio patologico di x [2] = 51, x [1] = 50, x [0] = 1, X = 100. Quindi è necessario che l'algoritmo "consideri" le possibilità di apportare modifiche con coin x [2], alternativamente facendo il cambiamento iniziando con x [1]. Il primo passaggio utilizzato con monete nazionali, altrimenti noto come Greedy Algorithm - con lo, "usa la moneta più grande in meno del totale di lavoro", non funzionerà con monete patologiche. Invece, tali algoritmi sperimentano un'esplosione combinatoria che li qualifica in NP-completo.
Per determinati accordi con valori di monete speciali, come praticamente tutti quelli in uso effettivo e incluso il sistema fittizio X [i + 1] == 2 * X [i], esistono algoritmi molto veloci, anche O (1) nel caso fittizio dato, per determinare il risultato migliore. Questi algoritmi sfruttano le proprietà dei valori delle monete.
Non sono a conoscenza di una soluzione di programmazione dinamica: quella che sfrutta soluzioni secondarie ottimali come richiesto dal motivo di programmazione. In generale, un problema può essere risolto solo con una programmazione dinamica, se può essere scomposto in sotto-problemi che, quando sono risolti in modo ottimale, possono essere ricomposti in una soluzione che è provabilmente ottimale. Cioè, se il programmatore non può dimostrare matematicamente ("dimostrare") che la ricomposizione ottimale delle sotto-soluzioni del problema si traduce in una soluzione ottimale, allora la programmazione dinamica non può essere applicata.
Un esempio comunemente dato di programmazione dinamica è un'applicazione per moltiplicare più matrici. A seconda delle dimensioni delle matrici, la scelta di valutare A · B · C sussiste una delle due forme equivalenti: ((A · B) · C) o (A · (B · C)) porta ai calcoli di diverse quantità di moltiplicazioni e aggiunte. Cioè, un metodo è più ottimale (più veloce) rispetto all'altro metodo. La programmazione dinamica è un motivo che calcola i costi computazionali di diversi metodi ed esegue i calcoli effettivi in base a un programma (o programma) calcolato dinamicamente in fase di esecuzione.
Una caratteristica fondamentale è che i calcoli vengono eseguiti in base alla pianificazione calcolata e non da un'enumerazione di tutte le combinazioni possibili, indipendentemente dal fatto che l'enumerazione sia eseguita in modo ricorsivo o iterativo. Nell'esempio della moltiplicazione delle matrici, ad ogni passo, viene scelta solo la moltiplicazione meno costosa. Di conseguenza, i possibili costi delle pianificazioni sub-ottimali a costo intermedio non vengono mai calcolati. In altre parole, la pianificazione non viene calcolata cercando tutte le pianificazioni possibili per l'ottimale, ma piuttosto sviluppando in modo incrementale una pianificazione ottimale dal nulla.
La nomenclatura "programmazione dinamica" può essere confrontata con "programmazione lineare" in cui "programma" viene anche utilizzato nel senso che significa "programmare".
Per ulteriori informazioni sulla programmazione dinamica, consultare il più grande libro sugli algoritmi a me noto, "Introduction to Algorithms" by Cormen, Leiserson, Rivest, and Stein. "Rivest" è la "R" di "RSA" e la programmazione dinamica è solo un capitolo dei punteggi.
Cover of the recommended book. http://ecx.images-amazon.com/images/I/41hJ7gLDOmL._SL500_AA300_.jpg
ignorare Heath, questo è dp – Timmy