题目描述:

给定n种物品和一个背包。物品 i 的重量是wi,其价值为vi,背包的容量为c. 应该如何选择装入背包中的物品,使其装入背包中的物品的总价值最大? 提示:可以选择物品 i 的一部分装入,而不一定要全部装入背包。

输入
背包的容量 物品的个数
物品的价值 物品的重量

输出
装入的物品 【1代表装入,0代表不装入,非0非1代表部分装入】

样例输入

50 3

60 10

100 20

120 30

样例输出

1 1 0.666667

题目来源

提示 输入重量和价值时,已经将物品按单位价值排序。

思路总结:
其实就是贪心算法的运用,每次我们都装入单位价值最大的,直到背包装满
但是有两种情况:

  1. 恰好装满,这种比较男的
  2. 最后一个物品,只装入部分

遇见的问题:
Java代码,提示一直是答案错误,折腾了很久,觉得思路没有错
最后发现是格式的问题,所以换的c++,由于老师用的是c++

问题解决所学到知识:

1.控制格式的输出:如果小数点后面有多的零,自动删除, 例如(1.220000 ----> 1.22, 1.0000 ----> 1.0, 0.000 ------>0 )

 BigDecimal bigDecimal = new BigDecimal(String.valueOf(x));System.out.print(bigDecimal.stripTrailingZeros().toPlainString()+" ");

2.二维数组的排序:使用java的Arrays.sort(), 中的Comparator<float[]>()

//   进行二维数组的排序
返回值大于0,则需要交换位置, 返回值小于0,表示顺序正确 ,返回值等于0 ,表示相等

/*** 返回值大于0,则需要交换位置, 返回值小于0,表示顺序正确 ,返回值等于0 ,表示相等* */float[][] a = new float[n][2];Arrays.sort(a, new Comparator<float[]>() {@Overridepublic int compare(float[] o1, float[] o2) {if (o2[2] > o1[2]){return 1;}else{return -1;}}});

参考代码:

java:默认输入的没有按照单价排序

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;/*** @author chenzi*/
public class Main {public static void main(String[] args) {int maxWeight, n, i, j;Scanner scanner = new Scanner(System.in);maxWeight = scanner.nextInt();n = scanner.nextInt();float[][] a = new float[n][4];for (i = 0; i < n; i++) {for (j = 0; j < 2; j++) {a[i][j] = scanner.nextFloat();}/*a[][2]用于存单价:价值/重量*/a[i][2] = a[i][0] / a[i][1];a[i][3] = i;}float[] result = new Main().Max_backpack(a, n, maxWeight);for (float x : result) {BigDecimal bigDecimal = new BigDecimal(String.valueOf(x));System.out.print(bigDecimal.stripTrailingZeros().toPlainString()+" ");}}private float[] Max_backpack(float[][] a, int n, int maxWeight) {float[] result = new float[n];int current_maxWeight = 0;
//        进行二维数组的排序/*** 返回值大于0,则需要交换位置, 返回值小于0,表示顺序正确 ,返回值等于0 ,表示相等*/Arrays.sort(a, new Comparator<float[]>() {@Overridepublic int compare(float[] o1, float[] o2) {if (o2[2] > o1[2]){return 1;}else{return -1;}}});for (int i = 0; i < n; i++) {if (current_maxWeight < maxWeight && current_maxWeight + a[i][1] <= maxWeight) {current_maxWeight += a[i][1];result[(int)a[i][3]] = 1;} else if (current_maxWeight < maxWeight && current_maxWeight + a[i][1] > maxWeight) {result[(int)a[i][3]] = (float) (maxWeight - current_maxWeight) / a[i][1];current_maxWeight = maxWeight;}else {break;}}return result;}
}

c++:输入已经按照单价排序

#include <iostream>
using namespace std;
/*------------------------------------------------------------------------------------------c++ 传入二维数组必须是指定第二维或者使用指针由于很久没有使用c++了,很多忘了,所以索性就在函数内输出了不成文规定:不能再函数中做输入输出的,应该返回结果的
---------------------------------------------------------------------------------------*/
void maxLoading(float a[][2], int n, float maxWeight)
{// c++不能返回数组,只能返回指针float current_maxWeight = 0;float result[n];for (int i = 0; i < n; i++){if (current_maxWeight < maxWeight && current_maxWeight + a[i][1] <= maxWeight){current_maxWeight += a[i][1];result[i] = 1;}else if (current_maxWeight < maxWeight && current_maxWeight + a[i][1] > maxWeight){result[i] = (maxWeight - current_maxWeight) / a[i][1];current_maxWeight = maxWeight;}else{// 简单分析得不满足前面两个判断,此时背包一定达到 maxWeightbreak;}}// 理应不该在这里做输出的for (float x : result){cout << x << " ";}
}int main()
{int n; float maxWeight;cin >> maxWeight >> n;float a[n][2];for (int i = 0; i < n; i++){for (int j = 0; j < 2; j++){cin >> a[i][j];}}maxLoading(a, n, maxWeight);
}

给定n种物品和一个背包。物品 i 的重量是wi.......相关推荐

  1. 【动态规划】01背包问题+查找背包物品

    目录 一.0-1背包问题 二.问题分析 1.确定备忘录的具体含义 2.状态转移方程 3.初始化 4.遍历顺序及输出 5.回溯法求解最大价值时的背包物品 三.总结 四.完整代码 一.0-1背包问题 给定 ...

  2. Unity背包系统-2:数据库存储方法ScriptableObject和显示背包物品InventoryManager

    1. 数据库脚本 1.1 元素(item)代码: using System.Collections; using System.Collections.Generic; using UnityEngi ...

  3. Q Inventory System unity背包物品插件 使用笔记

    Q Inventory System 一个非常不错的背包物品插件 功能很完整,用起来简单.但是作者好像很久没更新了 网上相关教程也比较少,用户手册上的内容版本对不太上了.我在此记录一下学习摸索的过程, ...

  4. NYOJ 354 问当n个物品合成一个时,最小重量是多少?

    Stripies 时间限制: 1000 ms | 内存限制: 65535 KB 难度: 1 描述 Our chemical biologists have invented a new very us ...

  5. 假如一种编程语言代表一个国家,哎哟,有意思了!

    "如果每种编程语言代表一个国家" Dimage Sapelkin 这是多么有趣的一个问题啊! ◆  ◆  ◆ C-俄罗斯 一切都必须以一种倒退的方式进行,但一切皆有可能,而且有很多 ...

  6. python,给定任意列表lst和一个任意值item,返回item在lst中第一次出现的位置

    python,给定任意列表lst和一个任意值item,返回item在lst中第一次出现的位置,如果lst中不存在元素item则返回字符串'不存在' 注意时返回字符串 运用list的index,即使有多 ...

  7. 给定四种水果,分别是苹果(apple)、梨(pear)、桔子(orange)、葡萄(grape),单价分别对应为3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元/公斤。

    给定四种水果,分别是苹果(apple).梨(pear).桔子(orange).葡萄(grape),单价分别对应为3.00元/公斤.2.50元/公斤.4.10元/公斤.10.20元/公斤. 首先在屏幕上 ...

  8. 7-55 查询水果价格 (15 分) 给定四种水果,分别是苹果(apple)、梨(pear)、桔子(orange)、葡萄…PTA:中M2021春C、Java入门练习第I段——变量、表达式、分支、循环

    7-55 查询水果价格 (15 分) 给定四种水果,分别是苹果(apple).梨(pear).桔子(orange).葡萄(grape),单价分别对应为3.00元/公斤.2.50元/公斤.4.10元/公 ...

  9. iOS换一种思路写一个无限轮播的滚动视图

    换一种思路写一个无限轮播的滚动视图 写这篇博客已经距离我当时写差不多有一个月时间了,也完善了很多,基本是没有bug的,如果有,不妨留言,喜欢的话,劳烦各位点个赞,不喜欢的,不妨看看思路,提提意见 1. ...

最新文章

  1. 网站优化人员必须具备的几个工作原则
  2. 【Flutter】创建 Flutter 项目 ( Android Studio 创建并运行 Flutter 应用 | 命令行创建并运行 Flutter 应用 | 运行 Flutter 应用三种方式 )
  3. js导出的xlsx无法打开_js-xlsx实现文件导出、下载(excel)
  4. OpenCV中cvAdds和cvAdd中的mask的用法探讨
  5. DataGrip按某列大小对数据集进行排序
  6. React组件生命周期-正确执行运行阶段的函数
  7. vsftpd + Berkeley DB 创建基于虚拟用户的FTP
  8. swift 2.1 安裝與下載
  9. android系统(106)---Android Netd ndc
  10. c语言 if判断条件语句吗,if条件判断语句,谁能帮我分析一下?
  11. 技术研究院006---B站自用的微服务框架——Kratos
  12. html canvas绘制网格,canvas(七)绘制网格和坐标轴
  13. Atitit 音频资料与音乐库管理系统功能 目录 1. 通用功能区 2 1.1. 批量处理功能文件夹遍历 2 1.2. Zip文件遍历与读取 2 1.3. Rar文件遍历与读取 2 1.4. She
  14. C语言 队列的实现(链表实现)
  15. 奖学金评审系统java_基于jsp的奖学金评定系统-JavaEE实现奖学金评定系统 - java项目源码...
  16. 照相机的成像原理,镜头和单反相机的认识
  17. 苹果邮箱怎么登录qq邮箱_邮箱格式怎么写 电子邮箱格式怎么写
  18. 阿里巴巴校招实习面试
  19. AspenTech利用ExaGrid实现全球数据备份和恢复策略的现代化
  20. URAL 1903 Unidentified Ships

热门文章

  1. Hbase 操作时出现:Server is not running yet
  2. RTD2555T RTD2556T(Typec) eDP屏显示介绍
  3. mysql实践教学大纲_MySQL数据库基础实例教程(微课版)-教学大纲.doc
  4. 慢即是快,少即是多!
  5. 维纳滤波进行图像去抖动去模糊
  6. 众昂矿业:有关于萤石的含氟精细化学品领域
  7. 用 python 拟合等角螺线
  8. 全国计算机python考试难吗_计算机二级python考试难吗
  9. 十万个为什么-基础篇
  10. go每日新闻--2020-05-20