Here is one way:
data have;
input Name $ X1-X10 total_cat;
cards;
A 1 1 1 1 0 0 0 0 0 0 4
B 0 0 1 0 0 0 0 1 1 0 3
C 1 1 1 0 0 0 0 1 1 0 5
D 1 1 0 0 0 0 0 1 1 0 4
E 0 1 0 0 0 0 0 0 1 0 2
F 0 0 0 0 0 0 0 1 0 0 1
G 0 0 1 0 0 0 0 0 0 1 2
H 1 0 0 0 0 0 0 0 0 1 2
I 0 1 1 0 0 0 0 0 0 1 3
J 1 1 0 0 0 0 0 0 0 0 2
;
proc sql noprint;
select distinct max(total_cat)
into :maxcat
from have
;
quit;
data want (keep=name used:);
set have;
array selected(*) x1-x10;
array used(&maxcat.) $2.;
j=0;
do i=1 to &maxcat.;
used(i)='0';
end;
do i=1 to dim(selected);
if selected(i) eq 1 then do;
j+1;
used(j)=vname(selected(i));
end;
end;
run;