program da;
var a:array[0..101]of longint;
f,b:array[-10..300000]of longint;
l,s,t,m,i,n,j,k,o,p:longint;
begin
readln(l);
readln(s,t,m);
for i:=1 to m do read(a[i]);
for i:=1 to m do
for j:=i+1 to m do
if a[i]>a[j] then
begin
k:=a[i];
a[i]:=a[j];
a[j]:=k;
end;
a[m+1]:=l;
for i:=1 to m+1 do
begin
if abs(a[i]-a[i-1])>2520 then
begin
o:=a[i]-a[i-1]-2520;
for j:=i to m+1 do
a[j]:=a[j]-o;
end;
end;
l:=a[m+1];
for i:=1 to m do b[a[i]]:=1;
for i:=1 to l do f[i]:=maxint;
for i:=1 to l do
begin
for j:=s to t do
if i-j>=0 then
if f[i]>f[i-j]+b[i] then f[i]:=f[i-j]+b[i];
end;
writeln(f[l]);
end.
当s==t时,一切决策都是没有意义的,整道题也有DP蜕变成了模拟。
本题中所有的证明都是基于s<t的
我也忘了特判,结果同WA80.补上这段特判就AC了
if (s==t)
{
ans=0;
for (i=1; i<=m; ++i)
{
if ( stone[i] % s==0 )
++ans;
}
printf("%d\n", ans);
exit(0);
}