背包问题

1、kkksc03考前临时抱佛脚

题目

题目背景

kkksc03 的大学生活非常的颓废,平时根本不学习。但是,临近期末考试,他必须要开始抱佛脚,以求不挂科。

题目描述

这次期末考试,kkksc03 需要考 4 科。因此要开始刷习题集,每科都有一个习题集,分别有 s 1 , s 2 , s 3 , s 4 s_1,s_2,s_3,s_4 s1​,s2​,s3​,s4​道题目,完成每道题目需要一些时间,可能不等

A 1 , A 2 , … , A s 1 A_1,A_2,\ldots,A_{s_1} A1​,A2​,…,As1​​,

B 1 , B 2 , … , B s 2 B_1,B_2,\ldots,B_{s_2} B1​,B2​,…,Bs2​​,

C 1 , C 2 , … , C s 3 C_1,C_2,\ldots,C_{s_3} C1​,C2​,…,Cs3​​,

D 1 , D 2 , … , D s 4 D_1,D_2,\ldots,D_{s_4} D1​,D2​,…,Ds4​​。

kkksc03 有一个能力,他的左右两个大脑可以同时计算 2 道不同的题目,但是仅限于同一科。因此,kkksc03 必须一科一科的复习。

由于 kkksc03 还急着去处理洛谷的 bug,因此他希望尽快把事情做完,所以他希望知道能够完成复习的最短时间。

输入格式

本题包含 5 行数据:第 11 行,为四个正整数 s 1 , s 2 , s 3 , s 4 s_1,s_2,s_3,s_4 s1​,s2​,s3​,s4​

第 2 行,为 A 1 , A 2 , … , A s 1 A_1,A_2,\ldots,A_{s_1} A1​,A2​,…,As1​​共 s 1 s_1 s1​个数,表示第一科习题集每道题目所消耗的时间。

第 3 行,为 B 1 , B 2 , … , B s 2 B_1,B_2,\ldots,B_{s_2} B1​,B2​,…,Bs2​​共 s 2 s_2 s2​ 个数。

第 4 行,为 C 1 , C 2 , … , C s 3 C_1,C_2,\ldots,C_{s_3} C1​,C2​,…,Cs3​​共 s 3 s_3 s3​ 个数。

第 5 行,为 D 1 , D 2 , … , D s 4 D_1,D_2,\ldots,D_{s_4} D1​,D2​,…,Ds4​​共 s 4 s_4 s4​ 个数,意思均同上。

输出格式

输出一行,为复习完毕最短时间。

输入输出样例

输入 #1

1 2 1 3
5
4 3
6
2 4 3

输出 #1

20

说明/提示

1 ≤ s 1 , s 2 , s 3 , s 4 ≤ 20 1\leq s_1,s_2,s_3,s_4\leq 20 1≤s1​,s2​,s3​,s4​≤20。

1 ≤ A 1 , A 2 , … , A s 1 , B 1 , B 2 , … , B s 2 , C 1 , C 2 , … , C s 3 , D 1 , D 2 , … , D s 4 ≤ 60 1\leq A_1,A_2,\ldots,A_{s_1},B_1,B_2,\ldots,B_{s_2},C_1,C_2,\ldots,C_{s_3},D_1,D_2,\ldots,D_{s_4}\leq60 1≤A1​,A2​,…,As1​​,B1​,B2​,…,Bs2​​,C1​,C2​,…,Cs3​​,D1​,D2​,…,Ds4​​≤60

思路

这道题看着输入样例有时候确实会让人感到有点害怕,但是实际上这并不是一道特别难的题目,只是对于同一个问题进行了四次重复处理罢了

当我们刚刚看到这道题的时候,很可能会把他当成一道贪心题来处理,但其实这并不正确

这道题的最终目的就是求得对于每一门科目,怎么才能让两个脑子所用的时间尽可能相等

那么很显然,背包就是这题最容易的解法了

背包问题怎么解决它呢?

首先我们可以想到,左右脑使用时间一样的时候,所用的总时间一定是一样的。

那我们可以把所有题目所需要的总时间除以2,再对其中一个脑进行01背包,也可以解释为:求出其中一个脑使用不超过一半总时间的最大能完成的作业量(时间为量度),那么这两个脑子所使用的时间一定是差距最小的。

那么要花的时间的最小值一定取自两脑中的最大值,显而易见的,右脑一定是大于等于 s u m 2 \frac{sum}{2} 2sum​,由此可以得到最少需要的时间

package com.lanqiao;import java.util.Scanner;/*** @author 王宇哲**/
public class P2389 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);//作业有四种,开五个数组方便计数int[] s = new int[5];//将每种作业的作业个数列出for (int i = 1; i <= 4; i++) {s[i] = scanner.nextInt();}//总时间int totalTime = 0;//动态规划(递归)数组int[][] dp;//存储每种科目每个作业的所需时间int[] times;//存储每个科目作业所需的总时间int everySubjectTime;//遍历五种作业for (int i = 1; i <= 4; i++) {//初始化这门科目所需时间为0everySubjectTime = 0;times = new int[s[i]+1];//输入每一个作业所需时间并求出总时间for (int j = 1; j <= s[i]; j++) {times[j] = scanner.nextInt();everySubjectTime += times[j];}//第一个维界表示当前选择了几个科目,第二个维界表示当前脑子最多可以容纳多少课程//注意,这里的第二维界不能选择一半的总时间,不然假如只有一个作业就会报错!!!dp = new int[s[i]+1][everySubjectTime  + 1];//对于每一个物品(作业)subject进行循环for(int subject = 1;subject <= s[i];subject++){//这个循环是为了更新那些不能放进背包的物品//if (times[subject] - 1 >= 0){//    System.arraycopy(dp[subject - 1], 1, dp[subject], 1, times[subject] - 1);//}for(int spareTime = 1;spareTime<times[subject];spareTime++){dp[subject][spareTime] = dp[subject-1][spareTime];}//对于每种容量(可用时间)spareTime进行循环for(int spareTime = times[subject]; spareTime <= everySubjectTime/2;spareTime++){//对于当前的课程进行选与不选的操作,看看那个价值(时间)更高dp[subject][spareTime] = Math.max(dp[subject-1][spareTime],dp[subject-1][spareTime-times[subject]]+times[subject]);}}totalTime += (everySubjectTime-dp[s[i]][everySubjectTime/2]);}System.out.println(totalTime);}}

详细的注释都在代码里面

洛古P2392-kkksc03考前临时抱佛脚相关推荐

  1. 洛谷——p2392 kkksc03考前临时抱佛脚

    今天练习了一些搜索,动态规划的题,只敢选普及-的来做,这个题看上去感觉用贪心来做,而且看上去不知道怎么用背包解题,他的最大"容量"是不确定的. 题目是这样的: [题目背景] kkk ...

  2. 洛谷P2392 kkksc03考前临时抱佛脚

    大意是给定4个整数集合,要求把每个整数集合分为两个部分,找到每个部分的最大值的最小,最后累加每个组的最小值. 深搜枚举每种情况 #include<iostream> #include< ...

  3. 【洛谷】P2392 kkksc03考前临时抱佛脚

    题目地址: https://www.luogu.com.cn/problem/P2392 题目背景: kkksc03的大学生活非常的颓废,平时根本不学习.但是,临近期末考试,他必须要开始抱佛脚,以求不 ...

  4. P2392 kkksc03考前临时抱佛脚(洛谷)JAVA

    题目背景 kkksc03 的大学生活非常的颓废,平时根本不学习.但是,临近期末考试,他必须要开始抱佛脚,以求不挂科. 题目描述 这次期末考试,kkksc03 需要考 4 科.因此要开始刷习题集,每科都 ...

  5. P2392 kkksc03考前临时抱佛脚

    题目地址 题目背景 kkksc03 的大学生活非常的颓废,平时根本不学习.但是,临近期末考试,他必须要开始抱佛脚,以求不挂科. 题目描述 这次期末考试,kkksc03 需要考 44 科.因此要开始刷习 ...

  6. P2392 kkksc03考前临时抱佛脚 (DFS)

    题目背景 kkksc03 的大学生活非常的颓废,平时根本不学习.但是,临近期末考试,他必须要开始抱佛脚,以求不挂科. 题目描述 这次期末考试,kkksc03 需要考 444 科.因此要开始刷习题集,每 ...

  7. kkksc03考前临时抱佛脚

    kkksc03考前临时抱佛脚 题目背景 kkksc03 的大学生活非常的颓废,平时根本不学习.但是,临近期末考试,他必须要开始抱佛脚,以求不挂科. 题目描述 这次期末考试,kkksc03 需要考 4科 ...

  8. kkksc03考前临时抱佛脚(DFS)

    题目背景 kkksc03 的大学生活非常的颓废,平时根本不学习.但是,临近期末考试,他必须要开始抱佛脚,以求不挂科. 题目描述 这次期末考试,kkksc03 需要考 44 科.因此要开始刷习题集,每科 ...

  9. 洛古最简单50题解(1-10)

    做为一名新手,首先要过一过题,找找成就感.(大佬略过).下面附上洛古最简单50题(大佬略过).以及最麻烦 AC代码,至少AC了. 目录·列表: 洛古最简单50题解(1-10) 洛古最简单50题解(11 ...

最新文章

  1. arcgis车辆轨迹动态_聪明反被聪明误 屏蔽车辆GPS被处罚
  2. 大三下学期第四周总结
  3. asp.net2.0中session在ie9下不能保存的问题
  4. 【Java面试题视频讲解】提取不重复的整数
  5. VTK:vtkConnectivityFilter用法实战
  6. 合并石子 区间dp水题
  7. python doc_2019-2020年Python3中文教程完整版.doc
  8. 【白皮书分享】2020年短视频全链路营销白皮书.pdf(附下载链接)
  9. php重签ipa,ipa重签(fastlane - sigh)
  10. 芒果DB删除指定日期内数据
  11. 你的Android HTTPS真的安全吗?
  12. 计算机语言output,output是什么意思
  13. ARM9——五级流水线结构,以及PC指针
  14. 计算机黑屏死机,电脑死机后开机黑屏怎么办
  15. 数模电路基础知识 —— 5. 常见电路符号说明(三极管)
  16. dbeave 安装驱动网络问题失败
  17. Lightning Network模拟器
  18. 力扣leetcode之10.11峰与谷
  19. PTA 2-1 旅游规划(最短路径问题)简单floyd算法
  20. 【路径规划】基于matlab A_star算法机器人避障最短路径规划【含Matlab源码 2295期】

热门文章

  1. RPC和WebService的区别
  2. 【读书】马克·李维《自由的孩子》摘录
  3. WxJava - 微信开发 Java SDK(开发工具包)
  4. python隐函数画图以及匿名函数lambda使用.md
  5. 华为硬件笔试部分题目
  6. Ubuntu分辨率调整
  7. scrapy 小项目——爬取豆瓣排行榜250
  8. 2015年计算机技术应用大赛,2015年全国大学生先进成图技术与产品信息建模大赛...
  9. CMD指令大全《花钱值得收藏》(100个指令)
  10. Python制作复古地牢文字冒险游戏