Ho $ 15 in tasca. Allo stesso modo, sono in un negozio che non dà il resto. Durante la navigazione, individuo un oggetto che costa $ 10 (tasse incluse). Posso acquistare quell'articolo senza perdere soldi?
In questo caso, la risposta è sì. Non importa come i miei $ 15 siano divisi (uno 10 e uno 5, o tre 5, o qualcos'altro), avrò sempre l'esatto $ 10 necessario.
Come secondo esempio, ho $ 0,16 in tasca. Quali altre somme di denaro devo essere in grado di pagare esattamente?
Possible Divisions:
0.01, 0.05, 0.10
0.01, 0.05 x 3
0.01 x 16
Guaranteed Exact Change:
0.01, 0.05, 0.06, 0.10, 0.11, 0.15, 0.16
E se avessi $ 0,27 in tasca?
Possible Divisions:
0.01 x 2, 0.25
0.01 x 2, 0.05, 0.10 x 2
0.01 x 2, 0.05 x 3, 0.10
0.01 x 2, 0.05 x 5
0.01 x 27
Guaranteed Exact Change:
0.01, 0.02, 0.25, 0.26, 0.27
Nel caso sopra, c'erano solo poche somme di denaro per le quali avrei sempre avuto un cambiamento perfetto.
Il tuo compito
Scrivi il programma più breve (o la funzione denominata) che prende A) un importo intero di denaro e B) un elenco di possibili tagli come input e genera un elenco degli importi di denaro per i quali devo avere un cambiamento perfetto. L'input può essere STDIN o argomenti per il programma o la funzione. Non sarò super rigoroso nella formattazione dell'input; può corrispondere al modo in cui la tua lingua formatta gli array.
Forse una spiegazione più dettagliata
Ho una certa quantità di denaro in tasca, che è formata da una serie di possibili dimostrazioni di valuta. Se ho $ 8 e so che le possibili denominazioni sono $ 2 e $ 3, allora ci sono solo tante diverse combinazioni di banconote che potrebbero essere nella mia tasca. Questi sono 2+2+2+2e 3+3+2. Per essere in grado di produrre una quantità esatta di denaro, devo essere in grado di produrre quella quantità usando le sole fatture che sono in tasca. Se avessi quattro 2, potrei produrre 2, 4, 6, or 8. Se avessi due 3 e un 2, potrei produrre 2, 3, 5, 6, or 8Dal momento che non so quale di queste combinazioni ho effettivamente in tasca, la mia risposta finale è ridotta a 2, 6, 8. Questi sono i valori che so che potrei produrre dalla mia tasca, dato l'importo totale e le possibili denominazioni.
I / O di esempio calcolato a mano
7 [3, 4]
3, 4, 7 //only one possible division into 3 + 4
7 [3, 2]
2, 3, 4, 5, 7 //the only division is 3 + 2 + 2
6 [2, 3, 4]
6 //divisions are 2+2+2, 3+3, 2+4
16 [1, 5, 10, 25] //this represents one of the examples above
1, 5, 6, 10, 11, 15, 16
27 [1, 5, 10, 25] //another example from above
1, 2, 25, 26, 27
1500 [1, 5, 10, 25, 100, 500, 1000, 2000]
500, 1000, 1500
600 [100, 500, 1000, 2000]
100, 500, 600
600 [200, 1, 5, 10, 25, 100, 500, 1000, 2000]
600
6 [2, 3, 4]. Non riesci 2+2+2a fare 3 e 3+3non a 2 e 4?