Pagini recente » Cod sursa (job #1684631) | Cod sursa (job #1314861) | Cod sursa (job #784427) | Cod sursa (job #137467) | Cod sursa (job #1709858)
#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;
}