Cod sursa(job #1839366)

Utilizator touristGennady Korotkevich tourist Data 2 ianuarie 2017 20:26:14
Problema Sate2 Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.28 kb
#include <bits/stdc++.h>
#define Nmax 3005

using namespace std;

int n,m,k,S,a[Nmax],b[Nmax],len,prv[30005];
bool dp[30005];

inline void remake(int sum)
{
    if(!sum)
    {
        len=0;
        return;
    }
    remake(sum-prv[sum]);
    b[++len]=prv[sum];
}

inline bool Solve(int n, int k)
{
    if(k==0) return 1;

    int i,j,p;
    dp[0]=1;
    for(i=1;i<=S;++i) dp[i]=0;

    for(i=n;i;--i)
    {
        for(j=S-a[i];j>=0;--j)
            if(dp[j] && !dp[j+a[i]])
            {
                dp[j+a[i]]=1;
                prv[j+a[i]]=a[i];
            }
        if(dp[S])
        {
            remake(S);
            reverse(b+1,b+len+1);

            int l=0;
            for(i=p=1;i<=n;++i)
                if(a[i]==b[p]) ++p;
                else a[++l]=a[i];
            n=l;

            return Solve(n,k-1);
        }
    }

    return 0;
}

int main()
{
    int T,i;
    ifstream cin("sate2.in");
    ofstream cout("sate2.out");
    cin>>T;
    while(T--)
    {
        cin>>n>>m>>k;
        for(i=1;i<=n;++i) cin>>a[i];
        if(m%k)
        {
            cout<<"NU\n"; continue;
        }
        sort(a+1,a+n+1);
        S=m/k;
        if(Solve(n,k)) cout<<"DA\n";
        else cout<<"NU\n";
    }
    return 0;
}