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     }
  • 相关阅读:
    设计模式-策略模式
    java8 流式编程
    《JAVA8开发指南》使用流式操作
    linux如何查看端口被哪个进程占用?
    mac 启动php-fpm报错 failed to open configuration file '/private/etc/php-fpm.conf': No such file or direc
    Mac home 目录下创建文件夹
    UML由浅入深
    PHP扩展Swoole的代码重载机制
    Gedit中文乱码
    linux 内核源码arch/ 目录的前世今生
  • 原文地址:https://www.cnblogs.com/noip/p/2648287.html
Copyright © 2011-2022 走看看