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实现算法——贪心算法解决背包问题相关推荐

  1. Java蓝桥杯——贪心算法

    贪心算法 贪心算法:只顾眼前的苟且. 即在对问题求解时,总是做出在当前看来是最好的选择 如买苹果,专挑最大的买. 最优装载问题--加勒比海盗 货物重量:Wi={4,10,7,11,3,5,14,2} ...

  2. java调度问题的贪心算法_贪心算法——换酒问题

    知识回顾 贪心算法 (greedy algorithm),又称贪婪算法. 是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法. 贪心算法在 有最优子 ...

  3. java调度问题的贪心算法_java代码,多机调度问题,怎么解释

    展开全部 多机调度问题的Java实现(贪心算法) 具体问题描述以及C/C++实现参见网址e68a843231313335323631343130323136353331333361323564[jav ...

  4. 插入排序java_「Java」各类排序算法

    排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序.内排序有可以分为以下几类: (1) 插入 ...

  5. 水桶平分 java_关于java:桶排序算法代码问题

    我需要在Java中实现以下内容. 输入:整数数组 输出:重新排列数组以具有以下内容: 假设原始数组中的第一个元素的值为x 在新数组中,假设x在位置I,即data[I] = x.然后,对所有x和所有j ...

  6. 整数反转leetcode java_【Java】【每日算法/刷穿 LeetCode】7. 整数反转(简单)

    首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]7. 整数反转(简单) 宫水三叶发布于 今天 12:10 题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数 ...

  7. 逆矩阵 java_用java描述矩阵求逆的算法

    今天很开心把困扰几天的问题解决了,在学习线性代数这门课程的时候.想通过程序实现里面的计算方法,比如矩阵求逆,用java代码该如何描述呢? 首先,咱们先用我们所交流语言描述一下算法思路: 1.求出一个矩 ...

  8. des 向量 java_在JAVA中使用DES算法

    DES算法提供CBC, OFB, CFB, ECB四种模式,MAC是基于ECB实现的. 一.数据补位 DES数据加解密就是将数据按照8个字节一段进行DES加密或解密得到一段8个字节的密文或者明文,最后 ...

  9. xmodem java_[转]JAVA实现CRC-CCITT(XMODEM)算法

    static final char TABLE1021[] = { /* CRC1021余式表 */ 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0 ...

最新文章

  1. 2021年高考模拟考成绩查询,2021年湖北省普通高考模拟考试成绩查询
  2. 怎样把 Boot Camp 里 Windows 的色温调节得和 Mac OS X 一致
  3. React事件系统研究总结
  4. LightOJ - 1236 (唯一分解定理)
  5. 如何快速理解递归——看这个就可以了
  6. maven 发布到仓库
  7. android学习笔记17——对话框(PopupWindow)
  8. php生成16位不重复随机码,PHP n个不重复的随机数生成代码
  9. Java工作笔记-Spring Boot封装Jedis实例
  10. 【数据库】范围 通配符 排序(2020.3.18
  11. 路径规划算法1.3抽样算法——PRM与RRT算法
  12. 信息化建设规划_中小型企业信息化建设规划方案
  13. Anaconda3下YOLOV3火焰检测
  14. wi ndows防火墙,网吧的防火墙怎么关?四种方法关闭WINDOWS防火墙
  15. java直播在线人数怎么做_添加抖音直播间在线人数怎么做
  16. 2000字谏言,给那些想学Python的人,建议收藏后细看!
  17. 谁有好的反P2p终结者的软件啊!
  18. GitHub Error: API rate limit exceeded
  19. 游戏打的菜?当然是延迟的锅啦~
  20. matlab在线_正版MATLAB向中国人民大学全校师生免费开放!

热门文章

  1. 修复mysql数据库供应商_修复MYSQL数据库
  2. 时间序列(四)ARIMA模型与差分
  3. 一致性直线提取--Coherent Line Drawing
  4. PAT甲级(Advanced Level)真题--1046 Sharing
  5. 计算机在线声音,电脑怎么在线录音
  6. android 图片列表,Android 列表使用(ListView GridView Gallery图片计时滚动)
  7. Spring-JDBC表情符号不能存入数据库
  8. @Profile 根据不同环境注入bean
  9. spring中这些能升华代码的技巧,可能会让你爱不释手
  10. Spring Cloud(二): 注册中心Eureka的使用