Java经典算法——窃贼问题
来源:互联网 发布:王健林 鲁豫 知乎 编辑:程序博客网 时间:2024/05/21 18:46
题目:
有一个窃贼带着一背包去偷东西,屋中有5件物品,其重量和价值如下,
物品1:6公斤,48元
物品2:5公斤,40元
物品3:2公斤,12元
物品4:1公斤,8元
物品5:1公斤,7元
背包最多装8公斤,如何拿能达到最大价值?
import java.util.Scanner;//Thing类型结构,属性有总量,价值,是否被选择class Thing { public double weight; public double value; public boolean isSelect;}public class QZWT { private static double maxWt; private static double maxValue; private static int num; private static Thing[] things; private static boolean[] seltTemp;//临时数组,用来暂时记录各个物品是否被选择 public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("背包承受最大重量为:"); maxWt = sc.nextDouble(); System.out.print("可选物品数量:"); num = sc.nextInt(); things = new Thing[num]; seltTemp = new boolean[num]; //将各个物品的各种信息填装进things数组中 for (int i = 0; i < num; i++) { System.out.print("请输入第" + (i + 1) + "号物品的重量和价值:"); Thing t = new Thing(); t.weight = sc.nextDouble(); t.value = sc.nextDouble(); things[i] = t; } //信息核对 System.out.println("\n背包承受最大重量为" + maxWt); for (int i = 0; i < things.length; i++) { System.out.println("第" + (i + 1) + "号物品的重量:" + things[i].weight + ",价值:" + things[i].value); seltTemp[i] = false; } maxValue = 0;//初始化已选的最大价值 //调用方法解决问题,第一传入数组things的地址,第二传入开始处理的物品的编号,第三传入已选物品总重量,第四传入已选物品总价值 handleBackpack(things, 0, 0.0, 0); System.out.println("\n将以下物品装入背包:"); double sumWt=0; for (int i = 0; i < num; i++) { if (things[i].isSelect) { System.out.println("物品" + (i + 1) + ",重量:" + things[i].weight + ",价值:" + things[i].value); sumWt+=things[i].weight; } } System.out.println("总重量为:" + sumWt + ",总价值为:" + maxValue); sc.close(); } private static void handleBackpack(Thing[] things, int i, double wt, double va) { //判断,若加进此物品是否超重 if (wt + things[i].weight <= maxWt) { seltTemp[i] = true;//加入选择 //判断是否为最后一个物品 if (i != num - 1) { //处理下一个物品 handleBackpack(things, i + 1, wt + things[i].weight, va + things[i].value); } else { //判断现已选中的物品的价值是否大于之前所设定的最大价值 if (va +things[i].value> maxValue) { //各物品isSelect属性填充 for (int j = 0; j < num; j++) { things[j].isSelect = seltTemp[j]; } //将现已选中的物品的价值设为最大价值 maxValue = va +things[i].value; } } } //将此物品取出 seltTemp[i] = false; //判断是否为最后一个物品 if (i != num - 1) { //处理下一个物品 handleBackpack(things, i + 1, wt, va); } else { //判断现已选中的物品的价值是否大于之前所设定的最大价值 if (va > maxValue) { //各物品isSelect属性填充 for (int j = 0; j < num; j++) { things[j].isSelect = seltTemp[j]; } //将现已选中的物品的价值设为最大价值 maxValue = va; } } }}
0 0
- Java经典算法——窃贼问题
- Java经典算法——汉诺塔问题
- 窃贼 背包问题
- 回溯算法经典应用之—N皇后问题 (Java)
- 回溯算法经典应用之—迷宫问题 (Java)
- Java经典问题算法大全
- Java经典问题算法大全
- Java经典问题算法大全
- Java经典问题算法大全
- java经典问题算法大全
- Java经典问题算法大全
- Java经典问题算法大全
- Java经典问题算法大全
- 经典算法问题——八皇后
- 硬币问题——《算法入门经典》
- 经典算法之—背包问题
- Java经典算法——插入排序
- Java经典算法——百钱百鸡
- 24种设计模式与7大原则
- [leetcode]345. Reverse Vowels of a String
- react使用小记1
- iOS利用Xcode制作静态库和动态库
- Mysql 执行外部脚本
- Java经典算法——窃贼问题
- 两个host上的qemu VM使用bridge互通
- 文章标题
- gdb调试-dump
- ps动作储存覆盖原文件的原因
- python实现感知机(perceptron)原型~
- windows平台搭带c++扩展的nodejs环境
- ES7中的异步编程,虽然我ES6还没有学会
- 2017.03.25暑期实习在线笔试