Cod sursa(job #878187)

Utilizator thesilverhand13FII Florea Toma Eduard thesilverhand13 Data 14 februarie 2013 09:03:47
Problema Diamant Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
# include <fstream>
# include <cstring>
# include <algorithm>
# include <vector>

# define dec 44200
# define mod 10000

using namespace std;

ifstream f("diamant.in");
ofstream g("diamant.out");

int N, M ,X;
int dp[ 3 ][ dec + 50 ];
int lim;
int sol;

void citire()
{
    int i, j;
    f >> N >> M >> X;

    for ( i = 1 ; i <= N ; i++ )
       for ( j = 1 ; j <= M ; j++ )
          lim += i * j;

}

 void afisare( int ind )
{
    int i;

    for ( i = -lim ; i <= lim ; i++ )
        g << dp[ ind ][ i + dec ] << " " ;
        g << "\n";

}

void dinamica()
{
    int i, j, k, ind = 1, val = 0;

    dp[ 0 ][ dec ] = 1;

    for ( i = 1 ; i <= N ; i++ )
       for ( j = 1 ; j <= M ; j++ )
        {
            val = ind % 2;
            for ( k = -lim ; k <= lim ; k ++ )
            {
                dp[ val ][ k + dec ] = 0;

                if ( k - i * j >= - dec )  // ca sa nu dea KBS,si sa nu adun o suma mai mica decat totalul elementelor "diamantelor"
                    dp[ val ][ k + dec ] = ( dp[ val  ][ k + dec ] + dp[ !val ][ k - i * j + dec ] );
                if ( k + i * j <= 2 * dec ) // ca sa nu adun o suma mai mare decat totalul elementelor "diamantului"
                    dp[ val ][ k + dec ] = ( dp[ val  ][ k + dec ] + dp[ !val ][ k + i * j + dec ] );

                dp[ val ][ k + dec ] = ( dp[ val ][ k + dec ] + dp[ !val  ][ k + dec ] ) % mod;// adun si sumele submultimii de ind - 1 diamante,ca in rucsac

                if (  k == X && ind == N * M )
                   sol = dp[ val ][ k + dec ];
            }
           // afisare( val );
            ind++;
        }

    g << sol;
}


int main()
{
    citire();
    dinamica();
    //afisare();
    return 0;
}