编码-京东实习笔试编程题-生日礼物-动态规划

本文介绍了京东实习笔试中的一道编程题,题目要求使用动态规划解决生日礼物包装问题。小东希望用尽可能多的信封包装卡片,卡片和信封不可折叠,且只能小信封装入大信封。给出输入数据和样例解答,解题思路涉及对信封面积排序和动态规划的备忘录法。代码以Java实现。
摘要由CSDN通过智能技术生成

题目:

生日礼物 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description: BF的生日快到了,这一次,小东决定为BF送一份特别的生日礼物为其庆生。作为高智商中的佼佼者,BF在国外求学,因此小东无法与之一起庆生。小东计划送一个生日卡片,并通过特别的包装让BF永远难忘。

她决定把卡片套装在一系列的信封A = {a1,  a2,  …,  an}中。小东已经从商店中购买了很多的信封,她希望能够用手头中尽可能多的信封包装卡片。为防止卡片或信封被损坏,只有长宽较小的信封能够装入大些的信封,同尺寸的信封不能套装,卡片和信封都不能折叠。

小东计算了邮寄的时间,发现她的时间已经不够了,为此找你帮忙包装,你能帮她吗? 输入 输入有若干组,每组的第一行包含三个整数n, w, h,1<=n<=5000, 1<=w, h<=10^6,分别表示小东手头的信封数量和卡片的大小。紧随其后的n行中,每行有两个整数wi和hi,为第i个信封的大小,1<=wi, hi<=10^6。 输出 对每组测试数据,结果第一行中输出最多能够使用的信封数量,结果第二行中按使用顺序输出信封的编号。由于小东有洁癖,她对排在前面的信封比较有好感,若有多个信封可用,她喜欢用最先拿到的信封。另外别忘了,小东要求把卡片装入能够装的最小信封中。 如果卡片无法装入任何信封中,则在单独的行中输出0。

样例输入 2 1 1 2 2 2 2 3 3 3 5 4 12 11 9 8​ 样例输出 1 1 3 1 3 2

解题思路:
具体思路如图片所示,首先针对所有的数据进行排序,排序的依据是信封的面积,然后利用动态规划的备忘录法,依次向前寻找其能存放的列,并将该数据与那一列组成新的一列(当前方多个列满足要求,并且前方列的高度相同时,取最前面的),最后输出的结果就是最优解。
这里写图片描述

详细的代码如下所示:(本人采用了Java来解,不过思路差不多,各位可以自由尝试)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

public 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值