本文为joshua317原创文章,转载请注明:转载自joshua317博客 算法-经典趣题-窃贼问题 - joshua317的博客

一、问题

窃贼问题是一个典型的最优解的问题。窃贼问题的大意如下:

有一个窃贼带着一个背包去偷东西,房屋中共有5件物品,其重量和价值如下。

物品1:6公斤,48元。

物品2:5公斤,40元。

物品3:2公斤,12元。

物品4:1公斤,8元。

物品5:1公斤,7元。

窃贼希望能够拿最大价值的东西,而窃贼的背包最多可装重量为8公斤的物品。那么窃贼应该装下列哪些物品才能达到要求呢?

二、分析

我们来分析一下窃贼问题,窃贼问题是关于最优解的问题,可使用动态规划的思想来解最优化问题。窃贼问题求解的操作过程如下:

(1)首先创建一个空集合。

(2)然后向空集合中增加元素,每增加一个元素就先求出该阶段最优解。

(3)继续添加元素,直到所有元素都添加到集合中,最后得到的就是最优解。

采用上述思路,窃贼问题的求解算法

(1)首先,窃贼将物品i试着添加到方案中。

(2)然后判断是否超重,若未超重,则继续添加下一个物品,重复第一步。

(3)若超重,则将该物品排除在方案之外,并判断未排除的物品价值是否大于已有最大值,如果大于就继续执行;如果不满足,则不必再尝试后续物品了。

三、编程

package com.joshua317;import java.util.Arrays;
import java.util.Scanner;
import java.util.logging.SocketHandler;public class Main {static double maxPrice;//最大的价值static double totalPrice;//物品的总价值static double maxWeight;//最大限制的重量static  int goodsNum;//可选物品的数量static char[] selectTemp;//临时数组public static void main(String[] args) {System.out.println("窃贼问题-最优化问题");System.out.println("请输入窃贼可以装入物品的最大重量");Scanner scanner = new Scanner(System.in);maxWeight = scanner.nextDouble();System.out.println("请输入窃贼可选物品的数量");goodsNum = scanner.nextInt();Goods[] goods = new Goods[goodsNum];totalPrice = 0;for (int i = 0; i < goodsNum; i++) {Goods temp = new Goods();System.out.println("请输入第"+(i+1)+"件物品的重量和价格");temp.weight = scanner.nextDouble();temp.price = scanner.nextDouble();totalPrice += temp.price;goods[i] = temp;}//打印初始化信息System.out.println("背包可以装入物品的最大重量为" + maxWeight);for (int i = 0; i < goodsNum; i++) {System.out.println("第" + (i+1) + "号物品的重量为:"+goods[i].weight + "  价格为:" + goods[i].price);}//初始化被选择信息selectTemp = new char[goodsNum];for (int i = 0; i < goodsNum; i++) {selectTemp[i] = 0;}maxPrice = 0;//求解backPack(goods, 0, 0.0, totalPrice);double totalWeight = 0;//总重量//打印最佳方案System.out.println("可以装入以下物品,使得获取的价值最大");for (int i = 0; i < goodsNum; i++) {if (goods[i].isSelect == 1) {System.out.println("第" + (i+1) + "号物品,其中:重量为:"+goods[i].weight + "  价格为:" + goods[i].price);totalWeight += goods[i].weight;}}System.out.println("总重量为:" + totalWeight + "总价值为:" + maxPrice);}public static void backPack(Goods[] goods, int i, double weight, double tp) {int k;//将物品i包含在当前方案中,判断重量是否小于等于最大限制的重量if (weight + goods[i].weight <= maxWeight) {selectTemp[i] = 1;//选择第i个物品if (i < goodsNum - 1) {//如果物品i不是最后一个物品backPack(goods, i+1, weight + goods[i].weight, tp);} else {for (k = 0; k < goodsNum; k++) {goods[k].isSelect = selectTemp[k];}maxPrice = tp;//保存方案的最大价值}}selectTemp[i] = 0;//取消物品i的选择状态//判断是否超重,还可以继续添加物品if (tp - goods[i].price > maxPrice) {if (i < goodsNum - 1) {//如果物品i不是最后一个物品backPack(goods, i+1, weight,tp - goods[i].price);} else {for (k = 0; k < goodsNum; k++) {goods[k].isSelect = selectTemp[k];}maxPrice = tp - goods[i].price;//保存方案的最大价值}}}}class Goods {double price;//价钱double weight;//重量char isSelect;//是否选中到方案里面
}

Java

Copy

本文为joshua317原创文章,转载请注明:转载自joshua317博客 算法-经典趣题-窃贼问题 - joshua317的博客

算法-经典趣题-窃贼问题相关推荐

  1. 算法-经典趣题-三色球

    本文为joshua317原创文章,转载请注明:转载自joshua317博客 算法-经典趣题-三色球 - joshua317的博客 一.问题 三色球是一个排列组合问题,三色球问题的大意如下:一个黑盒中放 ...

  2. 算法-经典趣题-青蛙过河

    本文为joshua317原创文章,转载请注明:转载自joshua317博客 算法-经典趣题-青蛙过河 - joshua317的博客 一.问题 青蛙过河是一个非常有趣的智力游戏,其大意如下: 一条河之间 ...

  3. 算法-经典趣题-兔子产仔

    本文为joshua317原创文章,转载请注明:转载自joshua317博客 算法-经典趣题-兔子产仔 - joshua317的博客 一.问题 兔子产仔是一个非常古老而经典的问题,其与数论有关.兔子产仔 ...

  4. 算法-经典趣题-渔夫捕鱼

    本文为joshua317原创文章,转载请注明:转载自joshua317博客 算法-经典趣题-渔夫捕鱼 - joshua317的博客 一.问题 渔夫捕鱼问题是一个典型的递推问题,渔夫捕鱼问题的大意如下: ...

  5. 程序员的算法趣题Q66: 设计填字游戏

    目录 1. 问题描述 2. 解题分析 2.1 基本算法流程 2.2 连通性检查 3. 代码及测试 4. 后记 1. 问题描述 2. 解题分析 与前面的Q32.Q59以及后面的Q68(碰巧先做了Q68) ...

  6. 100%的程序员都想挑战的算法趣题!| 码书

    计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...

  7. 我敢打赌,这是98%的程序员都想挑战的算法趣题!

    计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...

  8. 算法面试:精选微软经典的算法面试100题(第1-20题)

    算法面试:精选微软经典的算法面试100题 引言: 给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数. 上排的十个数如下: [0,1,2 ...

  9. java经典算法四十题

    java经典算法四十题 [程序9]题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 ".例如6=1+2+3.编程找出1000以内的所有完数. public class W ...

最新文章

  1. C++ 虚函数在基类与派生类对象间的表现及其分析
  2. JS性能--DOM编程之重排与重绘
  3. 云计算平台管理的三大利器Nagios、Ganglia和Splunk
  4. Kubernetes 的CRI-O容器引擎中存在严重漏洞
  5. 全网最详细的idea安装教程
  6. Centos 7.6 Install shc
  7. Xcode14 终于放弃了bitcode和armv7架构,还有iOS 9、iOS 10
  8. 如何使用Joplin搭建私有笔记软件
  9. 打印模板-Zebra指令
  10. 【叶神中级】四篇-3.页面访问
  11. 2020面试准备之Java集合
  12. ADT for Eclipse
  13. Linux – cp: omitting directory 复制文件失败
  14. 为什么我的同花顺选股服务器列表为空,同花顺选股公式,为什么我就选不出股票来呢数......
  15. 关于github的license选择
  16. 关于 DataFrame: 处理json数据(re模块,concat...)
  17. 快速多级子算法(Fast Multipole Method)
  18. Diamond 3.5简易教程(二)------软件的简单使用
  19. 星空深蓝色系新品项目发布会PPT模板
  20. 电脑钢琴 - 光良童话

热门文章

  1. 网站的服务器lp地址经常变动,服务器ip地址经常变动
  2. 智能机器人和人工智能
  3. 来安化云台山,认养一亩属于自己的专属茶园
  4. 产业主导者洗牌的时间,到了
  5. netty半包粘包 处理_Java NIO 框架 Netty 之美:粘包与半包问题
  6. 中关村科幻产业创新中心 “科技赋能文化旅游,洞见哈萨克斯坦”数字旅游展盛大开幕
  7. JVM基础知识(周阳老师笔记
  8. php把视频合成画中画,视频画面合并软件-怎么把多个视频合并到一个视频画面里面,制作多画面视频播放效果...
  9. Python的简单介绍(二)
  10. Pygame使用教程