Vorrei imparare il 3D :) (eserc PD) [c++]

Ecco come contare tutti i modi possibili (non abbiamo limiti dati da alcun k però)
Ossia se R = 5 ed abbiamo v1 = 1 , v2 = 2 , v3 = 5 (quindi 3 monetine diverse)
Il risultato è 4 (ossia tutti i modi possibili senza vincoli su k)
Ecco il codice:
//#include <cstdio>
#include <vector>
//#include<iostream>
#include <fstream>
using namespace std;
int
conta (vector < int >&B, int n, int t)
{
vector < int >appunti;
appunti.resize (t + 1, 0); //inizializziamo tutto a 0
appunti[0] = 1; // caso in cui non possiamo dare il resto
for (int i = 0; i < n; i++) //tutti i tagli vengono valutati aggiornando la nostra annotazione
for (int j = B[i]; j <= t; j++)
appunti[j] += appunti[j - B[i]]; // risparmiamo lo spazio O(n)
return appunti[t];
}
int main (void){
int T, N;
ifstream in ("in.txt");
in >> T >> N;
vector < int >B (N);
for (int i = 0; i < N; i++)
in >> B[i];
ofstream out ("out.txt");
out << conta (B, B.size (), T) << endl;
return 0;
}
Quello che rompe ora è k
Sicuro, ed è un metodo che vorrei imparare a fare, si potrebbe gestire il numero fissato k con un vettore a TRE DIMENSIONI:
B [ m, R , k ]
m : contiene i pezzi v1..vn che possiamo utilizzare per il cambio
r : la cifra R da raggiungere
k : è il numero richiesto che fissa il numero di pezzi
Risposte
Esiste un metodo lineare per determinare il numero minimo di monete utilizzabili. Se questo numero minimo è minore di \(k\) allora la risposta è si, altrimenti è no.
I tagli vengono tutti dati (tutti diversi tra loro) e possono essere memorizzati in un vettore.
Il problema richiede solo true o false, ma magari si potrebbe dire il numero possibile e, se non si può, dare -1.
Ma il mio scopo è usare un cavolo di array a tre dimensioni con la PD
Da settimane che ci provo (non al problema specifico di questo Topic).
Già lavorare con la PD è cosa ardua... Con un vettore [x,y,x] non ci sono mai riuscito
Tra l'altro non trovo mai esempi degni di nota
Il problema richiede solo true o false, ma magari si potrebbe dire il numero possibile e, se non si può, dare -1.
Ma il mio scopo è usare un cavolo di array a tre dimensioni con la PD
Da settimane che ci provo (non al problema specifico di questo Topic).
Già lavorare con la PD è cosa ardua... Con un vettore [x,y,x] non ci sono mai riuscito
Tra l'altro non trovo mai esempi degni di nota
Il problema è che sbaglio problemi. Avendo monete infinite ti basta usare una cosa del tipo:
int num_min = 0;
for(int i = N-1; i >= 0; --i)
{
num_min += resto_rimanente / valore[i];
resto_rimanente %= valore[i];
}
Non ho capito se non ho spiegato bene il problema: è una variazione che complica quello classico presente in molti testi. La variazione è che fissa il numero di monete ammesse alla soluzione; non ammette un numero minore o uguale ma esattamente un numero k.
Ora sicuro te hai "approfittato" del tuo sapere matematico per dare una soluzione corretta senza sbattersi con la PD
Riuscendo a lavorare con una tabella a tre dimensioni possiamo usare niente popò di meno che la MemoizationForm!
Una sorta di utopia proiettata in una dimensione spazio-temporale indefinita
Ora sicuro te hai "approfittato" del tuo sapere matematico per dare una soluzione corretta senza sbattersi con la PD
Riuscendo a lavorare con una tabella a tre dimensioni possiamo usare niente popò di meno che la MemoizationForm!
Una sorta di utopia proiettata in una dimensione spazio-temporale indefinita