题目一

1、题目描述

2、算法分析

2.1、解法1:直接暴力

总的空间是Y,现在有N个物品,每个物品的占用空间为P,数量为NUM。现在想要满足在不超过Y的条件下,能够放进去最多的物品数量是多少?

我们可以容易想到,要想在总空间一定的条件下,尽可能的放进去更多的物品,那么我们应该优先选择占用空间小的物品,当这些物品选完了,然后总空间还有剩余,我们才进一步考虑占用空间大的其他物品。

import java.io.*;
import java.util.*;
class Test{public static void main(String[] args){Scanner sc = new Scanner(System.in);int y =sc.nextInt();//总的空间资源int n =sc.nextInt();//商品种类数目int [] value = new int[n];int [] nums = new int[n];//定义一个nx2的矩阵来存储b组物品的空间资源大小和数量int[][] arr = new int[n][2];for(int i=0;i<n;i++){arr[i][0]=sc.nextInt();//存每个物品的空间资源Parr[i][1]=sc.nextInt();//存每个物品的数量}//因为想要尽可能的选择更多数量的商品,所以我们尽可能选择占用空间小的商品,把小空间商品选完了才考虑空间大的商品//进行排序,根据物品占用空间资源升序Arrays.sort(arr,(int[] o1, int[] o2)->(o1[0]-o2[0]));//表示最多可以放的商品个数int ans =0;int curW = 0;for(int i=0; i<n; i++){if(curW >= y){break;}else{int tmp = (y-curW)/arr[i][0]; //求的当前剩余空间资源 可以放多少个当前物品if(tmp < arr[i][1]){ //如果剩余空间 计算得到可以放当前物品的个数tmp 小于该物品的数量上限,则把tmp个物品都放进ans += tmp;curW += tmp*arr[i][0];}else{ //如果计算的tmp 大于等于 该物品的数量上限,说明没有这么多个tmp商品,最多最能放进arr[i][1]个物品ans += arr[i][1];curW += arr[i][0] * arr[i][1];}}}System.out.println(ans);}
}

2.2、解法2:多重背包===》转为为01背包

我们知道01背包问题,物品的数量视为1,拿了就没了。本题的每一个物品却有数量限制,每件物品的数量为Num,那么我们把num件物品摊开,就可以构成01背包问题。

举例说明:

 所以,本题我们可以根据每件物品的数量,把其对应占用的空间资源展平,构成每件物品数量为1,空间资源为P,总的空间资源为Y的01背包问题,求装满Y的条件下,使用到的物品数量最多。

import java.io.*;
import java.util.*;
class Test{public static void main(String[] args){Scanner sc = new Scanner(System.in);int y =sc.nextInt();//总空间int n =sc.nextInt();//物品种类数List<Integer> value = new ArrayList<>();//每件物品占用的空间资源List<Integer> nums = new ArrayList<>();//每件物品对应的数量for(int i=0;i<n;i++){value.add(sc.nextInt());nums.add(sc.nextInt());}//多重背包改为01背包//把每件物品数量大于1的,全部展平为数量为1的多个物品for(int i=0;i<nums.size();i++){if(nums.get(i)==0){//删除数量为0的物品nums.remove(i);value.remove(i);}else{while(nums.get(i)>1){//物品数量大于1,展开//相当于当前物品有num个,我们就在value增加num-1个value(i)进去,//此时每个value(i)数量都为1,变成01背包value.add(value.get(i));nums.set(i,nums.get(i)-1);} }}// dp[j]表示当前总空间资源为j,能够放进去的最多物品数量int[] dp = new int[y+1];//总的空间资源大小for(int i=0;i<value.size();i++){//先遍历物品for(int j=y;j>=value.get(i);j--){//总空间,压缩dp,这里要倒序,防止物品多次加入dp[j]=Math.max(dp[j],dp[j-value.get(i)]+1);//可以选择放 或者不放}}System.out.println(dp[y]);}}

=================================================================

题目二

1、题目描述

GG   没时间做了!!!直接到第三题

===================================================================

题目3

1、题目描述

2、算法分析

2.1、解法1 :回溯+筛选

其实拿到这样的题,就是一个求组合的问题,只不过这里最后要的结果是这些组合里面最小的那个。涉及到组合、子集、排列、分割等问题,我们自然而然想到了回溯算法。

解题流程:

第一步:本题我先采用回溯算法,从数组arr中,选出某几个数值组合的数值之和>=Y的这些子集,存到总的可能结果集中;

第二步:从满足条件的结果集中,挑选出子集元素之和最小的即可(因为结果集中的每一个子集都满足元素之和大于等于优惠劵需求Y,这里要求我们尽可能少的消费拿到优惠劵,跳出子集元素之和最小的,也就是我们的最小消费了)

import java.io.*;
import java.util.*;
class Test{public static void main(String[] args){Scanner sc = new Scanner(System.in);int n =sc.nextInt();int y =sc.nextInt();int [] value = new int[n];for(int i=0;i<n;i++){value[i]=sc.nextInt();}List<List<Integer>> result = new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();backtrack(result,path,value,y,0,0);int ans = Integer.MAX_VALUE;List<Integer> list = new ArrayList<>();for(int i=0;i<result.size();i++){int tmp=0;list = result.get(i);for(int j=0;j<list.size();j++){tmp+=list.get(j);}ans=ans>tmp ? tmp:ans;}System.out.println(ans);}private static void backtrack(List<List<Integer>> result, LinkedList<Integer> path,int[] arr ,int y,int startIdx,int sum){if(sum>=y){result.add(new ArrayList<>(path));return;}for(int i=startIdx;i<arr.length;i++){path.add(arr[i]);sum +=arr[i];backtrack( result,path,arr,y,i+1,sum);sum -=path.getLast();path.removeLast();}}}

2.2、解法2 :回溯+筛选(在解法1基础优化)

上面的解法中,我们可以发现,我们先回溯算法保存了一个满足最低消费要求的所有结果子集,然后又从这一堆结果集中选出 元素之和最小的那个子集,这个最小元素之和就是 我们要满足约束条件可以得到的最低花费。

其实,进一步思考,我们可以发现,我们绕了一个圈,额外花费了很多空间来保存满足条件的结果集 ,绕绕转转 最后还是回到了找到满足条件子集中元素之和最小的,返回这个最小元素之和的值。

那么我们为什么还要去花费空间保存满足条件的所有结果集,,我们要的只是满足条件的所有可能中的最小花费,所以我们可以在回溯的过程中就直接保存满足条件的每个子集的元素之和,最后选择最小的那个就是答案!!!!

import java.io.*;
import java.util.*;
class Test{public static void main(String[] args){Scanner sc = new Scanner(System.in);int n =sc.nextInt();int y =sc.nextInt();int [] value = new int[n];for(int i=0;i<n;i++){value[i]=sc.nextInt();}List<Integer> list = new ArrayList<>();//存放所有满足条件的子集sum,,最后获取最小的sum就是我们的最少花费LinkedList<Integer> path = new LinkedList<>();//临时维护的满足条件的子集int sum =0;//临时维护的子集元素之和//回溯算法backtrack(list,path,value,y,0,0);//list排序Collections.sort(list, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o1 > o2 ? 1:-1;}});System.out.println(list.get(0));}public static void backtrack( List<Integer> list,LinkedList<Integer> path,int[] arr ,int y,int startIdx,int sum){if(sum>=y){ //如果当前子集path元素之和大于等于y,满足消费门槛了,该子集保存到结果集中作为候选list.add(sum);return;}//递归 回溯for(int i=startIdx;i<arr.length;i++){path.add(arr[i]);sum +=arr[i];backtrack(list,path,arr,y,i+1,sum);sum -=path.getLast(); //要注意撤销回溯的时候,sum也要减去撤销的物品价值path.removeLast();}}}

解法2 优化三:

其实上面的代码还可以继续优化,我们要的只是满足约束条件的所有组合子集中,子集元素之和最小值,所以我们其实没有必要新建一个list来存储所有满足约束的子集的元素之和,然后再从这个元素和中选出最小的一个。(这里就又又绕圈的感觉了!!)

为什么要存所有满足约束 的组合子集的元素和,然后再去挑最小的,这么傻了吗??所以我们可以直接用一个全局变量来维护 当前满足条件的所有组合子集中 元素和最小值,,回溯结束,那我们子集最小值也维护结束,直接输出这个全局变量就是结果!!!!!!

便利蜂2022.3.17笔试相关推荐

  1. 便利蜂2022数据分析秋招一面凉经

    1.看板相关. 1.1 构建看板的主要指标有哪些? 1.2 最重要的两个指标? 2.异常分析 2.1 假设以周为例,本周相比上周某一个指标上涨50%,怎么分析? 2.2 如果用模型来监测异常,怎么做? ...

  2. 互联网晚报 | 8月17日 星期三 | ​龙湖回应网传将于8月底破产;苹果因搜包向零售员工赔偿2亿;便利蜂回应​被传“大幅关店”...

    龙湖集团回应网传将于8月底破产:谣言,已报案并获受理 龙湖集团官微发布声明称,近日,有人在社交平台恶意散布"龙湖将于8月底破产"等谣言,对我司的声誉造成了严重损害.对于上述恶意中伤 ...

  3. 2022便利蜂4.14算法笔试题

    1. 三道概率论的题目 正态分布问题 便利蜂产品质量服从正态分布,X~N(10, 0.1^2),任选一件产品,其质量在9.8-10.2的概率是多少.Φ(1)=0.483,Φ(2)=0.9772,Φ(2 ...

  4. 便利蜂发布《白领早餐报告》:仅5成白领每天吃早餐

    11月25日消息,便利蜂近日发布<白领早餐报告>.数据显示,每10个白领就有1个从来不吃早餐,原因是"不够时间"."没有胃口". 据悉,便利蜂通过全 ...

  5. 便利蜂是“冬眠”还是“假寐”,只有时间知道

    近两年,实体零售普遍面临窘境,闭店关店的话题时常出现,不少细分消费品类和零售品牌都先后陷入不同程度的关店潮,零售便利店也难以避免. 近日,"便利蜂出现大幅关店潮"的消息不胫而走,8 ...

  6. 2年多的时间,我在便利蜂便利店消费了4千多块

    便利蜂便利店小商店,类似于7-11.FamilyMart等. 今天无意间在微信的小程序列表中看到了「便利蜂」,点击进入「订单」界面,看到了历史购买记录,一直往下滑竟然翻到了第一条订单. 所有订单记录都 ...

  7. 便利蜂 java后端开发 面经

    笔试三道题 ac 80% 一周后收到面试通知 便利蜂java后端实习 一面(42min) 一开始面试官给我讲了下本次面试的流程,大概面试时间,面试官人很好,很有礼貌.面试过程中我答不上的他也细心引导我 ...

  8. 【每日面试】便利蜂 java后端开发

    面经来源 作者:牛客740319942号 链接:https://www.nowcoder.com/discuss/669721?source_id=discuss_experience_nctrack ...

  9. 【每日面试】2021便利蜂123面Java

    作者:aduner 链接:https://www.nowcoder.com/discuss/754282?source_id=discuss_experience_nctrack&channe ...

最新文章

  1. tenserflow.js 环境搭建
  2. IIS7.5中神秘的ApplicationPoolIdentity
  3. 自制反汇编逆向分析工具 迭代第六版本 (五)
  4. es6 --- 模块
  5. ZOJ The Sum of Unitary Totient(min_25 筛)
  6. Java instead of 用法_我又不是你的谁--java instanceof操作符用法揭秘
  7. CentOS 6.4 64位系统U盘安装
  8. redmine一键安装
  9. APP价格标签页设计灵感!多款案例选择!
  10. unison+inotify-tools实现双向实时同步
  11. 计算机网络基本原理pdf,自考计算机网络基本原理课程学习.pdf
  12. PhalAPI学习笔记拓展篇 ——— 基于MySQL数据库交互题目
  13. MVVM和MCV模式
  14. 生活随记-冬天的馈赠
  15. GlobalSign和DigiCert对比
  16. 操作animate.css的一些小技巧
  17. Flink时间语义与watermark的原理
  18. 小米域名拦截检测API接口
  19. AOV网络——初了解
  20. 计算机网络框架大纲(脑图可自提)----1.概述

热门文章

  1. Cesium画个雷达四凌锥体
  2. linux 命令总结
  3. 服务端渲染ssr(server side render)
  4. 【图解】联想IdeaPad V450拆机教程,光驱位安装固态硬盘图解
  5. 统信uos操作系统虚拟机安装_【IT之家学院】统一操作系统 UOS 尝鲜记(一):下载安装...
  6. fw:[Odysseus Ithaca]南京中兴软创科技股份有限公司介绍
  7. ‘$connector-0‘: Invocation of init method failed; nested exception is java.net.BindException: Addres
  8. 炫云渲染质量功能介绍
  9. 没有空间的感觉是什么样子的
  10. es6去除重复项_javascript在ES6中从数组中筛选出重复项并仅返回唯一值