2015-09-04 20 views
5

Ho difficoltà con la programmazione dinamica. Stavo provando il banale problema Coin Change - COIN CHANGE Problem UVaAlgoritmo modifica monete con programmazione dinamica

Sto cercando di utilizzare l'approccio top-down con la memorizzazione, ma sto ricevendo TLE. Ecco il mio code-

#include <bits/stdc++.h> 
using namespace std; 
#define ll long long 

typedef vector <int > vi; 
typedef vector <vi> vii; 
const int maxn = 10000007; 

int Set[maxn]; 
int Coin(int n,int m,vii & dp) 
{ 
    if(n==0) 
     return 1; 
    else if(n<0 || m<0) 
     return 0; 

    else if(dp[n][m]!=-1) 
     return dp[n][m]; 
    else 
    { 
     dp[n][m]=Coin(n-Set[m],m,dp)+Coin(n,m-1,dp); 

     return dp[n][m]; 
    } 
} 

int main() 
{ 
    int n,m=5; 
    Set[0]=50,Set[1]=25,Set[2]=10,Set[3]=5,Set[4]=1; 
    while(scanf("%d",&n)!=EOF) 
    {  
     vector <vector <int> > dp(n+1,vector<int> (m,-1)); 
     dp[0][0]=0; 
     cout << Coin(n,m-1,dp) << endl; 
    } 
} 

voglio sapere sto facendo di memorizzazione sbagliato o top-down non funziona in questo caso e l'approccio bottom-up è l'unica opzione.

+0

Che cosa è esattamente la semantica di 'dp [i] [j]'; è il numero di possibili modi per usare monete di tipo 'j' per un valore monetario di' i' o è qualcosa di diverso? – Codor

+0

Sì, è il numero di modi per utilizzare le monete di tipo j per il valore monetario i – Joker

risposta

3

Non devi chiamare la funzione Coin per ogni banco di prova (ogni valore di n) come m (numero di tipi di monete) rimane lo stesso in tutti i casi quindi chiamalo solo una volta per il valore massimo che è 7489 qui. e quindi rispondi a tutti i testcase come dp [n] [4]. Si prega di consultare il codice qui sotto per una migliore comprensione.

n = 7489; 
vector <vector <int> > dp(n+1,vector<int> (m,-1)); 
dp[0][0]=0; 
Coin(n,m-1,dp); 
while(scanf("%d",&n)!=EOF) 
{  

    cout<<dp[n][4]<<endl; 
} 
+0

Grande, immagino che questo risolva il problema. Stavo cercando di ottimizzare la parte principale di algo, ma non ho mai pensato che sarebbe stato testato per più test case. – Srinath

+0

Grazie mille. Ho pensato che ci fosse qualche problema con la mia ottimizzazione. – Joker

Problemi correlati