Cod sursa(job #1709720)

Utilizator UNIBUC_Costan_Iordache_MagureanuGangster Teddy Bears Trio UNIBUC_Costan_Iordache_Magureanu Data 28 mai 2016 13:36:47
Problema Sate2 Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.19 kb
#include<cstdio>
#include<algorithm>
#define M 90000
#define N 3000
using namespace std;

bool viz[M+1];
int chestie[M+1];
int v[N+1];

void solve(int n,int m,int k){
    if (m%k!=0){
        printf ("NU\n");
        return ;
    }

    int sat=m/k,i,j;

    for(;k>0;k--){
        sort(v+1,v+n+1);
        while(v[n]==M+1) n--;

        viz[0]=true;
        for(i=n;i>0 &&viz[sat]==false;i--){
            for(j=m-v[i];j>=0;j--){
                if (viz[j+v[i]]==false &&viz[j]==true){
                    viz[j+v[i]]=true;
                    chestie[v[i]+j]=i;
                }
            }
        }

        if (viz[sat]==false){
            printf ("NU\n");
            return ;
        }

        j=sat;
        while(j>0){
            i=chestie[j];
            j=j-v[i];
            v[i]=M+1;
        }

        for(i=0;i<=m;i++){
            viz[i]=0;
            chestie[i]=0;
        }
    }

    printf ("DA\n");
}


int main(){
    freopen ("sate2.in","r",stdin);
    freopen ("sate2.out","w",stdout);
    int n,m,t,i,k;

    scanf ("%d",&t);
    for(;t>0;t--){
        scanf ("%d%d%d",&n,&m,&k);

        for(i=1;i<=n;i++)
            scanf ("%d",&v[i]);

        solve(n,m,k);
    }

    return 0;
}