题目描述
 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.

相关文章:

  • 2022-12-23
  • 2022-02-15
  • 2021-10-04
  • 2022-12-23
  • 2021-08-22
  • 2021-10-12
  • 2021-10-04
  • 2021-10-08
猜你喜欢
  • 2022-12-23
  • 2021-12-05
  • 2022-12-23
  • 2021-08-25
  • 2022-12-23
  • 2022-03-08
相关资源
相似解决方案