题目

题目来自《编程之美》:在微软亚洲研究院上班,大家早上来的第一件事是干啥呢?查看邮件?No,是去水房拿饮料:酸奶,豆浆,绿茶、王老吉、咖啡、可口可乐……(当然,还是有很多同事把拿饮料当做第二件事)。

管理水房的阿姨们每天都会准备很多的饮料给大家,为了提高服务质量,她们会统计大家对每种饮料的满意度。一段时间后,阿姨们已经有了大批的数据。某天早上,当实习生小飞第一个冲进水房并一次拿了五瓶酸奶、四瓶王老吉、三瓶鲜橙多时,阿姨们逮住了他,要他帮忙。

从阿姨们统计的数据中,小飞可以知道大家对每一种饮料的满意度。阿姨们还告诉小飞,STC(Smart Tea Corp.)负责给研究院供应饮料,每天总量为V。STC很神奇,他们提供的每种饮料之单个容量都是2的方幂,比如王老吉,都是23=8升的,可乐都是25=32升的。当然STC的存货也是有限的,这会是每种饮料购买量的上限。统计数据中用饮料名字、容量、数量、满意度描述每一种饮料。

分析:此处构造的最优子结构和实现的代码不同于《编程之美》,采用动态规划自底向上的方法解决该问题。

1、数学建模

假设STC供提供n中饮料(n=1,2,...n),对应饮料的参数如下

要求的问题描述如下:

饮料总量为

在这个前提下,求解使总满意度最大,即

对于最优化问题,可以考虑是否能用动态规划求解。同时,该问题很类似于01背包问题,即在总量一定的前提下,使总价值(此处为满意度)最大,所以可以借鉴01背包问题的思想来解决该问题。

2、动态规划求解

2.1描述最优子结构

用f(i)来表示选取饮料i时的最大满意度。假设f(i-1)是选取饮料i-1时的最大满意度,那么

f(i)=max{f(i-1)+k*H[i]}  (v[i-1]*k<=v',v'为f(i-1)时的剩余重量)

其中k=0,1,...,c[i]。

可以证明f(i)为饮料i时的最大满意度,假设如果还有比f(i-1)还大的满意度,则可替换,但是这个假设与f(i-1)是选取饮料i-1时的最大满意度矛盾。

由此确定的最优子结构为

2.2递归定义最优解的值

当i=1时,f(1)=max{k*H[i]}

当i>1时,f(i)=max{f(i-1)+k*H[i]}  (v[i-1]*k<=v',v'为f(i-1)时的剩余重量)

其中k=0,1,...,c[i]。

终止条件:f(0)=0(没有饮料时,满意度为0)

2.3按自底向上方式计算最优解的值

用数组f记录满意度,f[n]为最优满意度,初始值为f[0]=0。数组remainV记录当前剩余总重量,初始值为remainV[0]=V。数组resultK记录对应饮料选择的最终数目,用于构造最优解,初始值为resultK[0]=0。

伪代码如下

/*

n=1,2,...n 饮料名称

V饮料总量上限

*/

f(n,V,C,H){

//初始化

f[0]=0;//数组f记录满意度,f[n]为最优满意度

remainV[0]=V;//数组remainV记录当前剩余总重量

resultK[0]=0;//数组resultK记录对应饮料选择的最终数目,用于构造最优解

for(inti=1;i<=n;i++){//饮料名称

currentf=f[i-1];

for(intk=0;k<=c[i];k++){

//剩余重量判断

tempV=k*v[i];

if(tempV>current[i-1])

break;

tempf=f[i-1]+k*H[i];

if(temp>=currentf){

curretnf=temp;

resultK[i]=k;

}//end if

else

resultK[i]=result[i-1];

}//end for

//记录剩余重量

currentV[i]=current[i-1]-resultK[i]*v[i];

}//end for

//返回最优满意度

returnf[n];

}//end f

2.4由计算出的结果构造一个最优解

//根据resultK构造最优解

for(inti=1;i<=n;i++){

System.out.println("饮料"+i+选取的数目为"+resultK[i]);

}//end for

子问题个数为饮料种类数目n,每个子问题的选择数目为该种饮料的最大上限数目c[i],所以时间复杂度为O(n*max{c[i]}),算法中用3个长度为n+1的数组保存值,故空间复杂度为O(n)

饮料供货java_动态规划(3):饮料供货动态规划(3):饮料供货 | 学步园...相关推荐

  1. ifft变换用java_利用FFT 及 IFFT实现傅立叶正反变换 | 学步园

    貌似是很久没有写日志了,前段时间一直很想写关于矩阵特征值在迭代 毕业设计貌似也跟仿真有关,所以重拾matlab来做一些小的仿真,先说说利用FFT 和 IFFT来实现傅立叶正反变换吧.看了很多资料,网上 ...

  2. 分支限界法 java_算法java实现–分支限界法–单源最短路径问题 | 学步园

    单源最短路径问题的java实现(分支限界法) 具体问题描述以及C/C++实现参见网址 http://blog.csdn.net/liufeng_king/article/details/8900872 ...

  3. 动态规划走楼梯_动态规划问题为什么要画表格?

    ❝ 本文是我的 91 算法第一期的部分讲义内容.91 算法第一期已经接近尾声,二期的具体时间关注我的公众号即可,一旦开放,会第一时间在公众号<力扣加加>通知大家. ❞ 动态规划可以理解为是 ...

  4. 【算法】动态规划 ④ ( 动态规划分类 | 坐标型动态规划 | 前缀划分型动态规划 | 前缀匹配型动态规划 | 区间型动态规划 | 背包型动态规划 )

    文章目录 一.动态规划场景 二.动态规划分类 1.坐标型动态规划 2.前缀划分型动态规划 3.前缀匹配型动态规划 4.区间型动态规划 5.背包型动态规划 一.动态规划场景 动态规划 动态规划使用场景 ...

  5. 动态规划生产存储matlab,动态规划方法的matlab实现及其应用

    <动态规划方法的matlab实现及其应用>由会员分享,可在线阅读,更多相关<动态规划方法的matlab实现及其应用(6页珍藏版)>请在人人文库网上搜索. 1.动态规划方法的动态 ...

  6. 最长公共子序列算法 java_转【算法之动态规划(三)】动态规划算法之:最长公共子序列 最长公共子串(LCS)字符串相似度算法...

    1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...

  7. ccf压缩编码java_压缩编码(CCF)——动态规划

    试题编号:    201612-4 试题名称:    压缩编码 时间限制:    3.0s 内存限制:    256.0MB 问题描述: 问题描述 给定一段文字,已知单词a1, a2, -, an出现 ...

  8. java动态规划货车运输_动态规划01背包问题_动态规划方法在配送线路优化中的应用研究...

    [摘要] 应用图论的方法对配送线路进行优化的缺点是,当线路复杂时计算较为烦琐,而应用动态规划的方法能有效解决这个问题.本文从理论上应用动态规划的方法对共同配送线路进行优化,并应用此方法对实际问题进行计 ...

  9. 【动态规划】状态压缩动态规划

    整理的算法模板合集: ACM模板 目录 一.集合类状态压缩动态规划 A. AcWing 91. 最短Hamilton路径 B.AcWing 524. 愤怒的小鸟 二.连通类(棋盘类)状态压缩动态规划 ...

最新文章

  1. php 多线程上传,PHP多线程(pthreads)参数传递学习笔记
  2. 通过这组数据分析发现房价波动背后的规律
  3. “后完美日记”时代,橘朵、花知晓、funnyelves们还有机会吗?
  4. 使用XML方式进行AOP编程(代码)
  5. C# 中科学计数法转成正常值
  6. 《数据库系统实训》实验报告——存储过程
  7. python爬虫运行不出结果_请问这个为什么就是爬不到,运行之后电脑卡的不行,求大佬指导...
  8. 如何在阿里云里申请并使用免费https证书SSL、nginx下配置https证书
  9. Alex 的 Hadoop 菜鸟教程: 第19课 华丽的控制台 HUE 安装以及使用教程
  10. 面试评估表和评估指标雷达图(附模板下载)
  11. 男生种草潮流社区edge(嘿市),会是男生的小红书吗?
  12. STM32+二维码扫描模块(QR_Scaner)实现门禁系统
  13. matlab 分数阶的预估校正算法及实现
  14. 平面设计入门新手需看技巧
  15. 1.8安装大华相机SDK及测试
  16. Ubuntu 安装 uWSGI
  17. C#-快递鸟电子面单打印API
  18. 学计算机要选什么科,计算机要学什么科目
  19. xshell卸载不干净导致无法安装
  20. 这帮死磕技术的理工男造了一支笔

热门文章

  1. error pulling image configuration: Get https://registry-1.docker.io/v2/library/redis/blobs/sha256:7e
  2. 设计模式 - 创建型模式_抽象工厂模式
  3. vue毕业设计nodejs古诗词鉴赏学习网站vscode
  4. 通过计算机随机产生一道四则运算题
  5. Java 计算工作日,休假,调休,调班等
  6. pandas库中unique函数方法
  7. linux shell 获取表,bash - 如何获取shell脚本中目录中的文件列表?
  8. 证明-快慢指针找链表环
  9. 智能交通数据集Rope3D(仅限科研使用)
  10. PHP网站开发中关于META标签的注意事项