Pagini recente » Cod sursa (job #2665918) | Cod sursa (job #2431180) | Cod sursa (job #2130595) | Cod sursa (job #3281747) | Cod sursa (job #1839343)
#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],dpcopy[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==1) return 1;
int i,j,p;
dp[0]=1;
for(i=1;i<=S;++i) dp[i]=0;
for(i=1;i<=n && a[i]<=S;++i)
{
for(j=0;j<=S-a[i];++j) dpcopy[j]=dp[j];
for(j=0;j<=S-a[i];++j)
if(dpcopy[j])
{
dp[j+a[i]]=1;
prv[j+a[i]]=a[i];
}
if(dp[S])
{
remake(S);
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;
}