Cod sursa(job #1709858)

Utilizator team_nameUPB Banu Popa Visan team_name Data 28 mai 2016 14:12:24
Problema Sate2 Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.85 kb
#include <iostream>
#include <algorithm>

using namespace std;

int t, n, m, k;

const int mmax = 90005;
const int nmax = 3005;

int v[nmax];
int bk[mmax];
bool dp[mmax], used[nmax];

int main() {
    freopen("sate2.in", "r", stdin);
    freopen("sate2.out", "w", stdout);

    scanf("%d", &t);

    while (t--) {
        scanf("%d %d %d", &n, &m, &k);

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

        if (m % k) { printf("NU\n"); continue; }

        int iter = 10;
        bool ok = 0;

        int x = m / k;
        while(--iter && !ok) {
            random_shuffle(v + 1, v + n + 1);

            dp[0] = 1;
            
            bool ok2 = 1;

            for(int i = 1; ok2 && i <= k - 1; ++i) {
                bool done2 = 0;
                for(int j = 1; !done2 && j <= n; ++j) {
                    if(used[j])
                        continue;

                    for(int ii = x; ii >= v[j]; --ii) {
                        if(!dp[ii] && dp[ii - v[j]]) {
                            dp[ii] = 1;
                            bk[ii] = j;
                        }
                    }
                    
                    if(dp[x]) {
                        int y = x;
                        while(y) {
                            used[bk[y]] = 1;
                            y -= v[bk[y]];
                            //printf("%d\n", v[bk[y]]);
                        }

                        //printf("\n");
                        done2 = 1;
                    }
                }

                for(int i = 1; i <= x; ++i)
                    dp[i] = 0, bk[i] = 0;

                if(!done2)
                    ok2 = 0;
            }

            ok = ok || ok2;
            for(int i = 1; i <= n; ++i)
                used[i] = 0;
         }

         if(!ok) printf("NU\n");
         else printf("DA\n");
    }

    return 0;
}