饮料供货问题-动态规划法解

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

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

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

那么,小飞如何完成这个任务,求出保证最大满意度的购买量呢?

2、分析:

问题可以这样理解:假设现在仅仅购买一种饮料,那么我们可以求出此时不同购买量的满意程度,然后再添加一种饮料,添加这种饮料与原来的那种饮料有很多的购买组合,求出此时所有符合要求组合的满意程度,简单来讲:

 * 设Opt(V’,i)表示从i到n-1种饮料中,总容量为V’的方案中,满意度之和的最大值。
 * 那么递归式就应该是:Opt(V’,i)=max{ k * Hi+Opt(V’-Vi * k,i+1)}(k=0,1,2…,Ci,i=0,1,2…,n-1)
 * 其中Ci为第i种饮料的最大供应量
 * opt[i][j] i代表供货总容量,j代表饮料种类。假设容量都是整数。i和j都从1开始考虑:
 * 当只有一种饮料时,容易求得各种总容量对应的最大满意度;
 * 当新增加一种饮料时,将一部分容量用新饮料代替,求得新的满意度;
 * 将新的满意度与旧满意度比较,如果新结果较大就更新。
 * 如何由opt[i][j-1]求得opt[i][j]呢?
 * --将一部分容量分给第j种饮料,那新的满意度就是(opt[i-k*v][j]+k*value),其中v代表第j种饮料每瓶的容量,k代表瓶数,value代表满意度

代码如下所示:

import java.util.*;
public class BeverageSupply 
{
	private static int v[];
	private static int h[];
	private static int c[];     //在这里我们是随机产生的,满意度,容量以及数量。实际的问题可以在这里直接进行设置,将后面的随机赋值去掉即可。
	private static int[][] opt; //存储最大满意度的数组。
	private static int x=0;     //备忘录参数,优化计算。当下一次计算的数值在上一次的范围内可以直接调用数组opt
	private static int y=0;
	public  static void main(String[] args) 
	{
		Scanner sc = new Scanner(System.in);
		Random r = new Random();
		while(sc.hasNextInt())
		{
			int V = sc.nextInt();
			int T = sc.nextInt();
			if(x>=V&&y>=T)
				System.out.println("总容量:"+V+" 最大满意度="+opt[V][T]);	
			else
			{
				x=V;y=T;v= new int[T];h = new int[T];c = new int[T]; 
				for(int i=0;i
程序运行结果如下:

10 3
满意度 	                 容量(每瓶)	           最多可提供数量(瓶)
3		             8		                 5
5		             4		                 6
6		             2		                 4
  0  0  0
  0  0  6
  0  0  6
  0  5 12
  0  5 12
  0  5 18
  0  5 18
  3 10 24
  3 10 24
  3 10 24
总容量:10 最大满意度=24
10 2
总容量:10 最大满意度=10
9 3
总容量:9 最大满意度=24

参考文章: http://bylijinnan.iteye.com/blog/1601908

你可能感兴趣的:(java语言,数据结构和算法)