部分背包的贪婪算法 java_使用JAVA实现算法——贪心算法解决背包问题
packageBasePart;importjava.io.BufferedReader;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStreamReader;/*** 使用贪心算法解决背包问题
* 背包问题:
* 旅行者有背包容量m公斤
* 现在有重量W1,W2,W3,W4....Wn
* 对应的价值V1,V2,V3,V4....Vn
* 运行重复携带,欲求得最大价值
* 贪心算法:求得最好的选择,但是贪心算法不是对于所有的问题都得到整体最优解
* 贪心算法基本思路:
* 1.建立数学模型来描述问题
* 2.把求解问题分成若干个子问题
* 3.对于每一个自问题求得局部最优解
* 4.把子问题的解局部最优解合成原来解问题的一个解
* 贪心算法的实现过程:
* 从一个初始解出发
* while-do朝总目标前进
* 求出可行解的一个解元素
* 由所有解元素组成合成问题的一个可行解*/
public classGreedy {/*解决背包问题
*需要背包容量
*背包价值
*背包剩余容量
*解向量集合*/
private doubletotal_weight;private doubletotal_value;private doublerest_weight;//储存排序数组
privateGood[] arrayValue;privateGood[] arrayWeight;privateGood[] arrayC_P;private intgoodsNum;privateGood[] goods;private doublereal_weight;publicGreedy() {
}public Greedy(int goodsNum,doubletotal_weight) {this.goodsNum=goodsNum;this.total_weight=total_weight;
}public void init(String filename) throwsIOException {/** 1.初始化程序
* 2.从TXT文件中得到商品重量和其价值数组
* 3.初始化序列数组arrayValue/Weight/C_P*/goods=newGood[goodsNum];
BufferedReader data=new BufferedReader(new InputStreamReader(newFileInputStream(filename)));
String buff;
String[] strs;//循环赋值
for(int i=0;i<4;i++){
buff=data.readLine();
strs=buff.split(" ");//根据位次
goods[i]=new Good();//对象数组不仅仅需要初始化数组,对于数组内的每一个对象也需要初始化
goods[i].setName(strs[0]);
goods[i].setValue(Double.parseDouble(strs[1]));
goods[i].setWeight(Double.parseDouble(strs[2]));
goods[i].figureC_P();
}//关闭输入流//成员变量初始化
arrayValue=newGood[goodsNum];
arrayWeight=newGood[goodsNum];
arrayC_P=newGood[goodsNum];//初始化数组
/** 价值由大到小数组*/arrayValue=arrayCopy(goods, arrayValue);//按照价值对arrayValue数组进行重新排列,使用冒泡排序法
for(int i=0;i
for(int j=i+1;j
Good temp=arrayValue[i];
arrayValue[i]=arrayValue[j];
arrayValue[j]=temp;
}
}
}/**质量由小到大数组*/arrayWeight=arrayCopy(goods, arrayWeight);//按照价值对arrayWeight数组进行重新排列,使用冒泡排序法
for(int i=0;i
for(int j=i+1;jarrayWeight[j].getWeight()){
Good temp=arrayWeight[i];
arrayWeight[i]=arrayWeight[j];
arrayWeight[j]=temp;
}
}
}/** 性价比由大到小排列*/arrayC_P=arrayCopy(goods, arrayC_P);//按照价值对arrayC_P数组进行重新排列,使用冒泡排序法
for(int i=0;i
for(int j=i+1;j
Good temp=arrayC_P[i];
arrayC_P[i]=arrayC_P[j];
arrayC_P[j]=temp;
}
}
}
}//用于数组拷贝
publicGood[] arrayCopy(Good[] goods,Good[] arr2){
arr2=goods.clone();returnarr2;
}private voidshow(Good[] goodsarr) {for(Good good:goodsarr){
System.out.println(good.getName()+"\t"+good.getValue()+"\t"+good.getWeight()+"\t"+good.getC_P()+"\t"+good.getNum());
}
}/*三种策略:度量准则
* 依次选取价值最大填充
* 依次选取重量最轻填充
* 依次选取比价最大填充
*
* 方法设计:
* 按照度量准则
* 传递一个按照选择优先级排列的对象数组
* 迭代计算剩余容量
* 返回设计方案*/
public voidstrategy(Good[] goodsArray){
rest_weight=total_weight;for(Good good:goodsArray){int selectNum=(int)Math.floor(rest_weight/good.getWeight());
rest_weight=rest_weight-selectNum*good.getWeight();
good.setNum(selectNum);if(rest_weight
}
}
}public voidcalculate(Good[] goodsArray,String target){
total_value=0;
real_weight=0;//处理结果
System.out.println("在以"+target+"为准则的情况下");for(Good good:goodsArray){
System.out.println(good.getName()+"\t\t数量:"+good.getNum());
total_value+=good.getValue()*good.getNum();
real_weight+=good.getWeight()*good.getNum();
}
System.out.println("总价值是:\t"+total_value+"\t总重量是:\t"+real_weight);
}public voidsolve() {/** 业务逻辑
* 将优先级数组*/strategy(arrayValue);
calculate(arrayValue,"价值");
strategy(arrayWeight);
calculate(arrayWeight,"重量");
strategy(arrayC_P);
calculate(arrayC_P,"比值");
}public static void main(String[] args) throwsIOException {
Greedy greedy=new Greedy(4,50);
greedy.init("goods.txt");
greedy.solve();
}
}
部分背包的贪婪算法 java_使用JAVA实现算法——贪心算法解决背包问题相关推荐
- Java蓝桥杯——贪心算法
贪心算法 贪心算法:只顾眼前的苟且. 即在对问题求解时,总是做出在当前看来是最好的选择 如买苹果,专挑最大的买. 最优装载问题--加勒比海盗 货物重量:Wi={4,10,7,11,3,5,14,2} ...
- java调度问题的贪心算法_贪心算法——换酒问题
知识回顾 贪心算法 (greedy algorithm),又称贪婪算法. 是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法. 贪心算法在 有最优子 ...
- java调度问题的贪心算法_java代码,多机调度问题,怎么解释
展开全部 多机调度问题的Java实现(贪心算法) 具体问题描述以及C/C++实现参见网址e68a843231313335323631343130323136353331333361323564[jav ...
- 插入排序java_「Java」各类排序算法
排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序.内排序有可以分为以下几类: (1) 插入 ...
- 水桶平分 java_关于java:桶排序算法代码问题
我需要在Java中实现以下内容. 输入:整数数组 输出:重新排列数组以具有以下内容: 假设原始数组中的第一个元素的值为x 在新数组中,假设x在位置I,即data[I] = x.然后,对所有x和所有j ...
- 整数反转leetcode java_【Java】【每日算法/刷穿 LeetCode】7. 整数反转(简单)
首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]7. 整数反转(简单) 宫水三叶发布于 今天 12:10 题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数 ...
- 逆矩阵 java_用java描述矩阵求逆的算法
今天很开心把困扰几天的问题解决了,在学习线性代数这门课程的时候.想通过程序实现里面的计算方法,比如矩阵求逆,用java代码该如何描述呢? 首先,咱们先用我们所交流语言描述一下算法思路: 1.求出一个矩 ...
- des 向量 java_在JAVA中使用DES算法
DES算法提供CBC, OFB, CFB, ECB四种模式,MAC是基于ECB实现的. 一.数据补位 DES数据加解密就是将数据按照8个字节一段进行DES加密或解密得到一段8个字节的密文或者明文,最后 ...
- xmodem java_[转]JAVA实现CRC-CCITT(XMODEM)算法
static final char TABLE1021[] = { /* CRC1021余式表 */ 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0 ...
最新文章
- 2021年高考模拟考成绩查询,2021年湖北省普通高考模拟考试成绩查询
- 怎样把 Boot Camp 里 Windows 的色温调节得和 Mac OS X 一致
- React事件系统研究总结
- LightOJ - 1236 (唯一分解定理)
- 如何快速理解递归——看这个就可以了
- maven 发布到仓库
- android学习笔记17——对话框(PopupWindow)
- php生成16位不重复随机码,PHP n个不重复的随机数生成代码
- Java工作笔记-Spring Boot封装Jedis实例
- 【数据库】范围 通配符 排序(2020.3.18
- 路径规划算法1.3抽样算法——PRM与RRT算法
- 信息化建设规划_中小型企业信息化建设规划方案
- Anaconda3下YOLOV3火焰检测
- wi ndows防火墙,网吧的防火墙怎么关?四种方法关闭WINDOWS防火墙
- java直播在线人数怎么做_添加抖音直播间在线人数怎么做
- 2000字谏言,给那些想学Python的人,建议收藏后细看!
- 谁有好的反P2p终结者的软件啊!
- GitHub Error: API rate limit exceeded
- 游戏打的菜?当然是延迟的锅啦~
- matlab在线_正版MATLAB向中国人民大学全校师生免费开放!
热门文章
- 修复mysql数据库供应商_修复MYSQL数据库
- 时间序列(四)ARIMA模型与差分
- 一致性直线提取--Coherent Line Drawing
- PAT甲级(Advanced Level)真题--1046 Sharing
- 计算机在线声音,电脑怎么在线录音
- android 图片列表,Android 列表使用(ListView GridView Gallery图片计时滚动)
- Spring-JDBC表情符号不能存入数据库
- @Profile 根据不同环境注入bean
- spring中这些能升华代码的技巧,可能会让你爱不释手
- Spring Cloud(二): 注册中心Eureka的使用