题目描述

  • Sidney想去Gandtom家玩。但Sidney家和Gandtom家之间是高低不平、坑坑洼洼的土路。所以他需要用他的背包装几袋稀的泥,在路上铺平一些干的土,使路变成平整的泥土,才能到Gandtom家见到Gandtom。
    已知现在有n种稀的泥,第i种稀的泥的质量为wi,体积为vi。Sidney的包能装体积不超过V的稀的泥。Sidney出门时携带的稀的泥的质量应该尽可能的大。在此前提下,携带的稀的泥的体积也应该尽可能的大。
    试求Sidney最多能携带多少质量的稀的泥与此时的最大体积上路。
  • Input
    第一行有一个整数T,表示组数。
    每组数据第一行有两个正整数n、V(0<n,V<=103) 。
    每组数据第二行有个n正整数,第i个数为wi(0<wi<=106)。
    每组数据第三行有个n正整数,第i个数为vi(0<vi<=103)
  • Output
    每组样例第一行输出两个整数。表示Sidney最多能携带多少质量的稀的泥与此时的最大体积上路。
    Sample Input
2
5 3
1 2 3 4 5
1 1 1 1 1
3 7
1 2 1
3 5 3

Sample Output

12 3
2 6

题目解析

  • 该题用贪心不好保证两个都最大,dp数组每个单元格表示,有j种水泥和i个背包容量的最优装载情况,在dp数组中可以通过dfs寻找每次“选择”的水泥(不过时间复杂度有些高)

代码

Scanner scanner=new Scanner(System.in);int T=scanner.nextInt();for (int i = 0; i < T; i++) {int n=scanner.nextInt();Shuini[] samples=new Shuini[n];int V=scanner.nextInt();for (int j = 0; j < n; j++) {samples[j]=new Shuini(scanner.nextInt(),0);}for (int j = 0; j < n; j++) {samples[j].vi=scanner.nextInt();samples[j].getUnitValue();}//贪心算法(无法保证w,v同时最大)//solve(samples,V);//dp动规划solve1(samples,V);}}private static void solve1(Shuini[] samples, int v) {int[][]  dp=new int[samples.length][v+1];//初始化dpfor (int i = 0; i < dp.length; i++) {//当背包没有容量的时候全部初始化为0dp[i][0]=0;}boolean falg=false;for (int i = 0; i < dp[0].length; i++) {if (falg) {dp[0][i]= samples[0].vi;continue;}if (i>=samples[0].vi) {dp[0][i]= samples[0].vi;falg=true;}else {dp[0][i]=0;}}//获取最大质量for (int i = 1; i < dp.length; i++) {for (int j = 1; j < dp[0].length; j++) {//当前背包装得下if(j>=samples[i].vi) {int yao=samples[i].wi+dp[i-1][j-samples[i].vi];int buyao=dp[i-1][j];dp[i][j]=max(yao,buyao);}else {//当前背包装不下dp[i][j]=dp[i-1][j];}}}//dfs(samples,dp,0,0,0);//获取背包装载最大v值System.out.println(dp[dp.length-1][v]);}private static int dfs(Shuini[] samples,int[][] dp, int x, int y,int maxV) {if(dp[x][y]==samples[x].wi) {maxV+=samples[x].vi;return maxV;}for (int i =dp.length-1 ; i >=0; i++) {for (int j = dp[0].length-1; j >= 0; j++) {//有可能出现要的情况(出现选和没选答案相同的情况)if(dp[x][y]-samples[x].wi-dp[x-1][y-samples[x].vi]==0) {maxV+=samples[x].vi;int xuanle=dfs(samples,dp, x-1, y-samples[x].vi,maxV);//回溯;maxV-=samples[x].vi;int meixuan=dfs(samples, dp, x-1, y,maxV);maxV+=max(xuanle,meixuan);}}}return maxV;}private static int max(int yao, int buyao) {if (yao>=buyao) {return yao;}return buyao;}//贪心算法,贪心失败//无法保持 质量和体积都最大//仅能保持质量最大private static void solve(Shuini[] samples,int V) {int maxWeight=0;int leftV=V;Arrays.sort(samples);Arrays.toString(samples);for (int i = 0; i < samples.length; i++) {if (leftV==0) {System.out.print(maxWeight+" ");System.out.println(V);return;}if(samples[i].vi<=leftV) {leftV-=samples[i].vi;maxWeight+=samples[i].wi;}}System.out.print(maxWeight+" ");System.out.println(V-leftV);}private static class Shuini  implements Comparable<Shuini>{int wi;int vi;int unitW;private void getUnitValue() {unitW = wi/vi;}//单位质量大的放前面,单位质量相同的,体积小的放后面@Overridepublic int compareTo(Shuini o) {if(this.unitW>o.unitW) {return -1;}else if (this.unitW==o.unitW) {return (int) (o.vi-this.vi);}else {return 1;}}public Shuini(int wi, int vi) {super();this.wi = wi;this.vi = vi;}@Overridepublic String toString() {return "Shuini [wi=" + wi + ", vi=" + vi + ", unitW=" + unitW + "]";}}

算法很美:01背包问题(动态规划、贪心)相关推荐

  1. 背包问题动态规划matlab,01背包问题动态规划详解

    计算机算法分析考试:动态规划0-1背包问题,怎么算她说她没醉,却一直摇摇晃晃掉眼泪:你说你爱她,却从未想过给她一个家. 要考试了,老师给划重点有一题:动态规划0-1背包问题,怎么算. 怎么理问题描述: ...

  2. 01背包问题 动态规划 java实现 简单通俗易懂

    ** 01背包问题 动态规划 ** 1.动态规划 什么是动态规划?动态规划就是将一个大问题不断向下拆分成小问题,直到拆分出的小问题可以求出其解,然后将小问题的解不断的向上合并,最终得到大问题的解决方案 ...

  3. 算法很美-位运算-找出落单的那个数

    上级目录:算法很美 1. 题目 一个数组里除了某一个数字之外,其他的数字都出现了两次.请写程序找出这个只出现一次的数字. 2. 异或思路 异或的运算是A ^ A=0,也就是说偶数个相同的元素异或,结果 ...

  4. 算法很美——数学问题

    算法很美--数学问题 题1:天平称重 问题描述: 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量. 砝码重量分别是1,3,9,27,81--3的指数次幂,每种重量砝码只有一个 则它们可以 ...

  5. 分支限界法 01背包c语言,算法笔记分支限界法01背包问题

    <算法笔记分支限界法01背包问题>由会员分享,可在线阅读,更多相关<算法笔记分支限界法01背包问题(12页珍藏版)>请在人人文库网上搜索. 1.问题描述给定n种物品和一背包.物 ...

  6. 01背包问题动态规划(二维数组)

    01背包问题动态规划(二维数组) 问题描述 ​ 一个旅行者有一个最多能装 M 公斤的背包,现在有 n 件物品,它们的重量分别是W1,W2,-,Wn,它们的价值分别为C1,C2,-,Cn,求旅行者能获得 ...

  7. 0-1背包问题动态规划模型的Python解法

    0-1背包问题动态规划模型的Python解法 1.01背包问题 2.Python解决方案 3.01背包问题例题 1.01背包问题 背包问题(Knapsack problem)是一种组合优化的NP完全问 ...

  8. 算法设计与分析 0-1背包问题 动态规划解法【超详细】

    0-1背包问题 问题描述 给定i个物品和一个容量为的背包,物品的重量是Wi,其价值为Vi 物品个数为i,背包容量为C. 如何选择装入背包内的物品,使得装入背包中的物品的总价值最大? 其中,每种物品只有 ...

  9. 01背包问题-动态规划算法(最简洁)

    动态规划算法: 思路:从第一个物品开始填表(m[i][j]),从左到右,从上到下 如果物品比背包容量大,即放不下,则m[i][j]=m[i-1][j] 如果物品比背包容量下,即放得下,则比较 放与不放 ...

  10. 01背包问题——动态规划详解

    有N件物品和⼀个最多能被重量为W的背包.第i件物品的重量是weight[i],得到的价值是value[i].每件物品只能⽤⼀次,求解将哪些物品装入背包⾥物品价值总和最⼤. 在题目中我们假设有三件物品 ...

最新文章

  1. redis session共享中的序列化问题
  2. LeetCode45 Jump Game II
  3. php js 防止重复提交表单,php如何防止form重复提交
  4. java发生fullgc的时机_2021-01-02:java中,MinorGC、MajorGC、FullGC 什么时候发生?
  5. 【源码】常用的人脸识别数据库以及上篇性别识别源码
  6. String 类的重要方法与字段
  7. document.addeventlistener方法不执行_JUnit 5 测试方法的执行优先级
  8. 脚本同步mysql数据_windows下数据库文件使用脚本同步到linux下的mysql数据库中
  9. VMware虚拟机桥接方式与真实主机共享上网
  10. mysql 5.7连接java_MACOS mysql 5.7 Navicat 可以连接 , Java 报错
  11. win7如何关闭uac(图文详解)
  12. python- 机器人抓取谷歌地图数据
  13. 正确卸载IE8并恢复IE6的两种方法
  14. Emule Edonkey server
  15. Html5 视频播放之video标签的使用(包含注意事项,例如视频无法正常展示,只显示音频等问题)
  16. vue常用之“定义全局变量constants”
  17. 【内网穿透服务器】利用云服务器+FRP实现内网穿透并远程连接服务器
  18. Mac电脑怎么关闭键盘的重复按键功能?
  19. 基本IO接口技术——微机第七章笔记
  20. 微分,梯度及梯度下降法

热门文章

  1. 计算机毕设Python+Vue疫情期间优化旅游平台(程序+LW+部署)
  2. 点成分享| 低温冷冻保存的技术研究(一)
  3. Sheldon Numbers (暴力枚举)
  4. 转自IT傻博士 ip directed-broadcast
  5. SEO优化:用SEO常用表格的原因,为什么要行使seo表格器材
  6. lol服务器位置地图,LOL老玩家一定能看懂的地图 每一个地点都充满回忆
  7. 「硬核JS」图解Promise迷惑行为|运行机制补充
  8. 鸿蒙系统首先预装华为的什么手机,首款预装鸿蒙系统的华为手机来了,不是P50,而是一款4G机型...
  9. To刘卓岭:在这里讨论下吧
  10. Gitment给基于hexo的yilia主题的博客搭建免费评论系统