Pagini recente » Cod sursa (job #1500855) | Cod sursa (job #7997) | Cod sursa (job #1576665) | Cod sursa (job #531089) | Cod sursa (job #1709924)
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define MAXN 3000
#define MAXM 90000
int v[MAXN+1], viz[MAXM+1], n, aux[MAXN+1], rez[MAXN+1];
bool check[MAXN+1];
inline void shuffle(){
int i, p, aux;
for(i=1; i<=n; i++){
p=rand()%i+1;
aux=v[p];
v[p]=v[i];
v[i]=aux;
}
}
inline bool numerge(int r, int n, int t){
int s=0, i, j;
memset(viz, 0, sizeof viz);
viz[0]=-1;
i=1;
while((i<=n)&&(viz[r]==0)){
s+=v[i];
if(s>r){
s=r;
}
for(j=s; j>0; j--){
if((viz[j]==0)&&(viz[j-v[i]])){
viz[j]=i;
}
}
i++;
}
if(viz[r]==0){
return 1;
}else if(t==1){
return 0;
}else{
memset(check, 0, sizeof check);
s=r;
while(s>0){
check[viz[s]]=1;
s-=v[viz[s]];
}
int e=0, u=0;
for(i=1; i<=n; i++){
if(!check[i]){
aux[++e]=v[i];
}else{
rez[++u]=v[i];
}
}
for(i=1; i<=e; i++){
v[i]=aux[i];
}
for(i=1; i<=u; i++){
v[i+e]=rez[i];
}
return numerge(r, e, t-1);
}
}
int main(){
int m, k, i, ok, t;
FILE *fin, *fout;
fin=fopen("sate2.in", "r");
fout=fopen("sate2.out", "w");
fscanf(fin, "%d", &t);
for(; t; t--){
fscanf(fin, "%d%d%d", &n, &m, &k);
for(i=1; i<=n; i++){
fscanf(fin, "%d", &v[i]);
}
ok=10000;
if(m%k!=0){
ok=0;
}
while((ok)&&(numerge(m/k, n, k-1))){
shuffle();
ok--;
}
if(ok){
fprintf(fout, "DA\n");
}else{
fprintf(fout, "NU\n");
}
}
fclose(fin);
fclose(fout);
return 0;
}