最大利润
题目描述
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 }