| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:help!!!In Reply To:Re:help!!! Posted by:palmtenor at 2005-04-22 21:22:33 来来来,贴一个不用那种奇怪的没有证明的结论的真正的DP标程~~`:)
const
n =6;
var
rock :array[1..n] of longint;
opt :array[0..60000] of boolean;
print :boolean;
mid :longint;
r :integer;
procedure init;
var
i :integer;
begin
mid:=0;
print:=true;
for i:=1 to n do
begin
read(rock[i]);
mid:=mid+rock[i]*i;
if rock[i] mod 2=1 then print:=false;
end;
readln;
end;
function min(a,b:longint):longint;
begin
if a<b then min:=a else min:=b;
end;
procedure dp;
var
max :longint;
i :integer;
j,k :longint;
begin
fillchar(opt,sizeof(opt),false);
opt[0]:=true;
max:=0;
print:=true;
for i:=1 to n do
begin
if rock[i]>0 then
for j:=max downto 0 do
if opt[j] then
begin
if opt[mid] then begin writeln('Can be divided.');exit; end;
for k:=1 to rock[i] do
begin
if (j+k*i>mid) or opt[j+k*i] then break;
opt[j+k*i]:=true;
end;
end;
max:=max+i*rock[i];
if max>mid then max:=mid;
end;
print:=false;
end;
begin
init;
r:=0;
while mid<>0 do
begin
inc(r);
writeln('Collection #',r,':');
if (mid mod 2=0) and not print then
begin
mid:=mid div 2;
dp;
if not print then writeln('Can''t be divided.')
end else
if print then writeln('Can be divided.')
else writeln('Can''t be divided.');
writeln;
init;
end;
end.
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator