这个题就是一个DP
F[I,J,K,P]表示在有I个员工 金钱是J 荣誉是K 距离发广告已经有P天的最小天数是多少
这个状态可以由 F[I-1{p=3) or i(p<3),*,*,MIN(P-1,0)] 推过来 里面俩个**指的是员工的分配方案,这个分配方案可以暴力枚举
在P=3的时候可员工人数多一个,并且可以转移到P=0 或者P=1
时间复杂度是O(最大员工数^2*x*y*4)
比较显然的是,我们不会招很多人,即使最坏情况,也最多只能找13个人,而在最坏情况下,并不可能招那么多,所以最大员工数在20+较为合理
所以时间完全足够
code
var
f:array[0..35,0..25,0..25,0..5] of longint;
x,y,z,a,b,aa,i,j,k,p,ans,xx,yy,ii,n,q:longint;
function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end;
procedure work(a1,b1,c1,d1:longint);
begin
if b1<0 then exit;
if (b1>a) then b1:=a;
if c1>b then c1:=b;
f[a1,b1,c1,d1]:=min(f[a1,b1,c1,d1],f[i,j,k,p]+1);
end;
begin
read(n,x,y,z,a,b);aa:=a;
a:=a+z-min(a,z);
for i:=0 to 30 do
for j:=0 to a do
for k:=0 to b do
for p:=0 to 3 do
f[i,j,k,p]:=maxlongint;
f[n,0,0,0]:=0;ans:=1000;
for i:=n to 34 do
for p:=0 to 3 do
for j:=0 to a do
for k:=0 to b do
begin
if f[i,j,k,p]=maxlongint then continue;
if (j>=aa) and (k>=b) then
begin
ans:=min(ans,f[i,j,k,p]);
continue;
end;
if f[i,j,k,p]>ans then continue;
for q:=0 to i do
begin
xx:=j+q*x;yy:=k+(i-q)*y;
ii:=i;if p=3 then ii:=ii+1;
if (p=0) or (p=3) then
begin
work(ii,xx,yy,0);
work(ii,xx-z,yy,1);
end
else
work(ii,xx,yy,p+1);
end;
end;
writeln(ans);
end.
仰慕200B就AC的!!跪烂!!至今不会200B做法!