import java.util.Arrays;
import java.util.Random;
public class BeverageSupply {
/**
* 编程之美 饮料供货
* 设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种饮料的最大供应量
*
* 想了好久都没法理解书上这个递推公式里面的i+1,为什么是i+1而不是其他?
* 后来我转换了一下,代码本质上是一样的,只是比较符合我自己的思路:
* 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代表满意度
*/
public static void main(String[] args) {
int T=3;
int V=10;
BeverageSupply beverageSupply=new BeverageSupply();
Beverage[] beverages=beverageSupply.initBeverage(V, T);
int maxValue=beverageSupply.maxValue(beverages,V, T);
System.out.println("总容量:"+V+" 最大满意度="+maxValue);
}
public int maxValue(Beverage[] beverages,int V,int T){
if(beverages==null||beverages.length==0){
return -1;
}
if(V<0){
return -1;
}
if(T<0 || T>beverages.length){ //beverages' index starts with 1
return -1;
}
int[][] opt=new int[V+1][T+1];
for(int j=1;j<=T;j++){
int c=beverages[j].count;
int v=beverages[j].volume;
int value=beverages[j].value;
for(int i=1;i<=V;i++){
for(int k=0;k<=c;k++){
if(i<k*v){
break;
}
int x=opt[i-k*v][j-1];
int y=x+k*value;
if(y>=opt[i][j]){
opt[i][j]=y;
}
}
}
}
// myprint(opt);
return opt[V][T];
}
static class Beverage{
int value; //满意度
int volume; //每瓶的容量
int count; //最多可提供多少瓶
Beverage(int value,int volume,int count){
this.value=value;
this.volume=volume;
this.count=count;
}
}
public Beverage[] initBeverage(int V,int T){
if( V<0 || T<0 ){
return new Beverage[0];
}
Beverage[] beverages=new Beverage[T+1];
Random random=new Random();
System.out.println("满意度 容量(每瓶) 最多可提供数量(瓶)");
for(int i=0;i<T;i++){
//value volume count随机生成
int value=random.nextInt(T)+1;
int volume=random.nextInt(V/2)+1;
int count=random.nextInt(V/2)+1;
beverages[i+1]=new Beverage(value,volume,count);
System.out.println(value+" "+volume+" "+count);
}
return beverages;
}
public void myprint(int[][] array){
if(array!=null){
for(int[] a:array){
System.out.println(Arrays.toString(a));
}
}
}
}
分享到:
相关推荐
编程软件 arduino-1.8.10-windows编程软件 arduino-1.8.10-windows编程软件 arduino-1.8.10-windows编程软件 arduino-1.8.10-windows编程软件 arduino-1.8.10-windows编程软件 arduino-1.8.10-windows编程软件 ...
少儿编程-少儿编程系统-少儿编程系统源码-少儿编程管理系统-少儿编程管理系统java代码-少儿编程系统设计与实现-基于ssm的少儿编程系统-基于Web的少儿编程系统设计与实现-少儿编程网站-少儿编程网站代码-少儿编程平台...
"Visual C++高级编程技术----OpenGL篇" 一书的源代码
常用设计编程工具 steel-钢结构应力查询.zip常用设计编程工具 steel-钢结构应力查询.zip常用设计编程工具 steel-钢结构应力查询.zip常用设计编程工具 steel-钢结构应力查询.zip常用设计编程工具 steel-钢结构应力...
《编程的奥秘--.NET软件技术学习与实践》是一本难得的学习VB.NET的好书,是金旭亮老师贡献给初学VB.NET者的一本启蒙书,有了这本书的指引,我们就能踏上面向对象编程之路。《编程的奥秘--.NET软件技术学习与实践》...
北京工业大学--算法作业2--动态规划算法实现0-1背包问题---Java代码 利用动态规划算法实现0-1背包问题或装配线调度问题。(二选一) 要求测试数据以文本文件的形式存储, 即所有的数据由文本文件读入。 利用动态...
CoDeSys资料合集
嵌入式对象--面向AMetal框架和接口的编程--周立功嵌入式对象--面向AMetal框架和接口的编程--周立功嵌入式对象--面向AMetal框架和接口的编程--周立功嵌入式对象--面向AMetal框架和接口的编程--周立功嵌入式对象--面向...
欧姆龙(OMRON)是全球知名的自动化技术解决方案提供商,其产品线中包含了各种可编程逻辑控制器(PLC)。CX-Programmer是欧姆龙专为编程这些PLC设计的一款强大的编程软件。在这个名为"欧姆龙OMRON PLC编程软件CX-...
c++趣味编程------数独 无解释 可以自己改代码 无bug
西门子SCL编程语言,全称为Structured Control Language,是一种基于高级语言的编程方式,用于在S7-300和S7-400系列PLC(可编程逻辑控制器)上进行程序编写。SCL提供了更为结构化和模块化的编程环境,与传统的IL...
在C语言编程中,动态规划是一种非常重要的算法思想,它主要应用于解决最优化问题,能够有效地处理具有重叠子问题和最优子结构的复杂问题。本主题将详细讲解如何使用C语言实现动态规划来求解最大子序和问题。 最大子...
JAVA网络编程课程设计-聊天室JAVA网络编程课程设计-聊天室JAVA网络编程课程设计-聊天室
WPF编程宝典1-8章WPF编程宝典1-8章WPF编程宝典1-8章WPF编程宝典1-8章WPF编程宝典1-8章WPF编程宝典1-8章
XML高级编程21-26.raXML高级编程21-26.raXML高级编程21-26.raXML高级编程21-26.raXML高级编程21-26.raXML高级编程21-26.raXML高级编程21-26.raXML高级编程21-26.raXML高级编程21-26.raXML高级编程21-26.raXML高级...
【三菱编程软件--fxgp-win-C(中文)】 三菱编程软件FXGP-WIN-C是一款专为三菱FX系列可编程控制器(PLC)设计的编程工具,适用于初学者和专业人士。这款软件提供了用户友好的界面和丰富的功能,使得编程、调试和监控...
5--[少儿编程奇幻之旅-烟花庆祝].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码5--[少儿编程奇幻之旅-烟花庆祝].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码5--[少儿编程奇幻之旅-烟花庆祝]....
游戏编程精粹1-7光盘源代码 整合包。一次下载,不要到处去找了。 辛苦下载整理不容易,赚点分,谢谢了。
本文将根据提供的文档摘要,探讨多款适合儿童编程学习的软件及游戏,帮助家长们更好地引导孩子们踏上编程之旅。 #### 少儿编程的背景与重要性 少儿编程是指针对儿童设计的编程课程或工具,旨在通过有趣的方式培养...