题目描述
X市的一家化工厂最近购买了一批重量为n克的化学原料。这种原料可以进行A,B两种化学实验,每种实验有其固定的利润及损耗率。已知,1克的原料做 A实验可得利润a元,但有p的损耗; 同样,1 克的原料做B实验可得利润b元,但有q的损耗。
一次全体实验定义为:将手头现有的全部原料一部分做A实验,另一部分做B实验。其利润为做A 实验的总利润与做B实验的总利润之和。
于是一个问题摆在面前,若化工厂准备做m次全体实验,那么如何安排每次实验,才能使得总利润最大呢?请你编程解决这个问题。
输入格式
输入文件仅1行,依次为: m, n,a,b,p,q
其中n,m,a,b为整数,且0<m<=30, 0<n<10000, 0<a,b<=1000,0<p<1, 0<q<1。
输出格式
输出文件仅一行,为最大利润,并保留五位小数
样例输入
3 100 300 500 0.3 0.6
样例输出
79000.00000
//------------------------------------------------------------------------------------------
f[i,j]表示第i次试验开始时,有j克原料的最大利润.
c[i]表示第i次实验的利润率,c[i]=f[i,j]/j,即c[i]*j=f[i,j].
从后往前倒推,我们发现第M次实验显然是哪种实验的利润率大就做哪种实验.
即c[m]=max(a,b).
令p=1-p,q=1-q,表示实验完后剩余的原料.
假设第i-1次实验用x克做A实验,0<=x<=j.
f[i-1,j]=ax+b(j-x)+f[i,xp+(j-x)q]
=ax+bj-bx+c[i]*[xp+(j-x)q]
=[a-b+c[i]*(p-q)]x+(b+c[i]*q)j
这是关于x的一次函数.
显然当x=0或j时取到最值.
当a-b+c[i]*(p-q)>0时,函数为增函数,x=j时取最值.
f[i-1,j]=c[i-1]*j=a*j+f[i,j*p]=a*j+c[i]*j*p
c[i-1]=c[i]*p+a;
当a-b+c[i]*(p-q)<=0时,同理可得c[i-1]=c[i]*q+b;
ans=c[1]*n;
code:
var f:array[0..31] of real;
m,n,a,b,i:longint;
p,q:real;
begin
readln(m,n,a,b,p,q);
if a>b then f[m]:=a
else f[m]:=b;
p:=1-p; q:=1-q;
for i:=m-1 downto 1 do
if a-b+f[i+1]*(p-q)>0 then f[i]:=a+f[i+1]*p
else f[i]:=b+f[i+1]*q;
writeln(f[1]*n:0:5);
end.