zoukankan      html  css  js  c++  java
  • 最大利润

    题目描述

     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     }
  • 相关阅读:
    Java实现 LeetCode 400 第N个数字
    Java实现 LeetCode 400 第N个数字
    Java实现 LeetCode 399 除法求值
    Java实现 LeetCode 399 除法求值
    Java实现 LeetCode 399 除法求值
    Java实现 LeetCode 398 随机数索引
    Java实现 LeetCode 398 随机数索引
    Java实现 LeetCode 398 随机数索引
    linux中的cd ..和cd -命令有什么区别?
    GCC使用
  • 原文地址:https://www.cnblogs.com/noip/p/2648287.html
Copyright © 2011-2022 走看看