Pagini recente » Cod sursa (job #311631) | Cod sursa (job #2078191) | Cod sursa (job #2379814) | Cod sursa (job #1100021) | Cod sursa (job #1839366)
#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;
}