最大利润

题目描述

 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。

输出格式

输出文件仅一行,为最大利润,并保留五位小数。

太牛x了!

最优,最大,最好,最少等问题基本算法为动态规划。

该题数学味很浓,要解题必须用数学方法去分析解法。

设 f[m] 为第m 次试验所取得的最大利润,c[m] 为第m 次试验所取得的最大利润的 每克原料的利润率。

令 q=1-q,p=1-p;分别表示原料的剩余率。

<1>f[m][n]=c[m]*n;  c[m]=max(a,b);

<2>f[m-1][n]=a*x+b*(n-x)+f[m][p*x+q*(n-x)];

     整理的       =x*[ a-b+c[m]*p-c[m]*q ] +b*n+c[m]*n*q;

                   为了使f[m-1][n]的值最大,x 为0或n;

                  所以f[m-1][n]=max{    (b+c[m]*q)*n , (a+c[m]*p)*n     }

                   所以 可推出 c[m-1]=max{b+c[m]*q , a+c[m]*p};

      。。。。。

    可推出c[1],

  则 f[1][n]=c[1]*n.

 1 #include<iostream>
 2 #include<stdlib.h>
 3 using namespace std;
 4 
 5 int m,n,a,b;
 6 double p,q,c;
 7 
 8 int main()
 9 {
10     cin>>m>>n>>a>>b>>p>>q;
11     p=1-p;q=1-q;
12     
13     c=max(a,b);
14     while(m>1)
15     {c=max(a+c*p,b+c*q);m--;}
16     
17     double ans;
18     ans=c*n;
19     
20     printf("%.5lf\n",ans);
21     
22     return 0;
23     
24     }
原文地址:https://www.cnblogs.com/noip/p/2648287.html