bzoj1389

比较有意思的一道题
初看肯定是dp一类,但好像没什么思路,
先令p=1-p q=1-q
如果我们用常见的f[i]到第i次试验最大利润的话
我们发现不好转移,因为影响因素不仅有价格,还有数量
考虑到原料总量一定,我们考虑用c[i]表示到第i次实验最大利润率
不难发现第m次试验,最大利润率一定是a和b那个较大的
边界是从最后确定的,我们考虑倒推
不妨设在第i此实验时,剩下有w克原料,有x*w的原料做a试验,w*(1-x)的原料做b试验 0<=x<=1
则c[i]=(w*a*x+w*(1-x)*b+c[i+1]*(w*p*x+w*(1-x)*q))/w
整理得c[i]=ax+b(1-x)+c[i+1]*p*x+c[i+1]*(1-x)*q
即c[i]=x(a-b+c[i+1]*(p-q))+b+c[i+1]*q
不难发现是关于x的一次函数,要使c[i]最大我们只要判断a-b+c[i+1]*(p-q)是否大于0即可
大于0 x取1,否则取0
然后就搞定了

 1 var c:array[0..40] of double;
 2     n,m,a,b,i:longint;
 3     p,q:double;
 4 
 5 begin
 6   readln(m,n,a,b,p,q);
 7   p:=1-p;
 8   q:=1-q;
 9   for i:=m downto 1 do
10     if a-b+c[i+1]*(p-q)>0 then c[i]:=a+c[i+1]*p
11     else c[i]:=b+c[i+1]*q;
12   writeln(c[1]*n:0:5);
13 end.
View Code
原文地址:https://www.cnblogs.com/phile/p/4473127.html