codevs2894、2837、1669、2503、3231
6.25动态规划之背包回顾
Txx是一个成绩很差的人,考试便成了他的噩梦。于是他常在考试时睡觉以打发时间。今天他又要面临一次考试,为了保证有充足的睡眠,他决定只做k分钟题目。这次测试有n道题,第i题的得分是pi分,需要耗费ti分钟解决(将要完成也得不到分)。
请你算出他最少扣多少分(总分是所有题目分值的总和)。
第一行k
第二行n
第三行到第n+2行每行两个数:ti和pi
Txx最少的扣分
5
3
2 6
1 3
4 7
6
100%的数据中,k<=100000,ti<=10000,pi<=10000;
30%的数据中,n<=20;
100%的数据中,n<=500
背包归类:01背包
- #include<cstdio>
- #include<iostream>
- using namespace std;
- #define N 101000
- int v[N],c[N],f[N],k,n,sum;
- int main(){
- scanf("%d%d",&k,&n);
- for(int i=;i<=n;i++){
- scanf("%d%d",v+i,c+i);
- sum+=c[i];
- }
- for(int i=;i<=n;i++){
- for(int j=k;j>=v[i];j--){
- f[j]=max(f[j],f[j-v[i]]+c[i]);
- }
- }
- printf("%d\n",sum-f[k]);
- return ;
- }
Aiden马上要考试了,可他还没怎么复习,于是他决定临时抱佛脚。他列了N个知识点,并分析出了复习每个知识点所需的时间t以及可能获得的分数k。他现在还有T时间来复习,他希望选择正确的知识点来在最短的时间内获得最高的期望分数。
第一行,两个数,分别为N、T。
接下来的N行,每行两个数t、k,表示一个知识点所需的时间和期望得分。
一行,一个数,表示可以获得的最高期望得分。
3 5
3 5
3 2
2 2
7
对于10%的数据,0<N≤10,0<T≤100。
对于50%的数据,0<N≤1000,0<T≤10000。
对于100%的数据,0<N≤5000,0<T≤10000,0<t,k≤1000。
背包归类:01背包
- #include<cstdio>
- #include<iostream>
- using namespace std;
- #define N 101000
- int v[N],c[N],f[N],k,n;
- int main(){
- scanf("%d%d",&n,&k);
- for(int i=;i<=n;i++){
- scanf("%d%d",v+i,c+i);
- }
- for(int i=;i<=n;i++){
- for(int j=k;j>=v[i];j--){
- f[j]=max(f[j],f[j-v[i]]+c[i]);
- }
- }
- printf("%d\n",f[k]);
- return ;
- }
德国放松对英国的进攻后,把矛头指向了东北——苏联。 1943年初,东线的站头进行到白热化阶段。据可靠情报,90余万德国军队在库尔斯克准备发动好大的攻势。因此,朱可夫元帅要求你立即从远东的军工厂运输大量装备支援库尔斯克前线。 列车司机告诉你,一趟列车最多可以容纳V体积的武器装备,但是你可能不能装满,因为列车承受不了那么大的重量,一趟列车最多可以承载G单位的重量。同时,军工厂仓库提供给你一份装备清单,详细记录了每件装备的体积、重量和火力。为了有效支援朱可夫元帅,你要找到一种方案,使得总火力值最大。
第一行:V和G表示最大重量和体积。 第二行:N表示仓库有N件装备; 第三到N+2行:每行3个数Ti Vi Gi表示个装备的火力值、体积和重量;
输出一个数,表示可能获得的最大火力值
6 5
4
10 2 2
20 3 2
40 4 3
30 3 3
50
【数据范围】
对于50%的数据,V,G,N≤100
对于100%的数据,V,G,N≤1000
背包归类:二维费用背包
- #include<cstdio>
- #include<iostream>
- using namespace std;
- #define N 1010
- int v[N],c[N],g[N],f[N][N],m,n,q;
- int main(){
- scanf("%d%d%d",&n,&m,&q);
- for(int i=;i<=q;i++){
- scanf("%d%d%d",c+i,v+i,g+i);
- }
- for(int i=;i<=q;i++){
- for(int j=v[i];j<=n;j++){
- for(int k=g[i];k<=m;k++){
- f[j][k]=max(f[j][k],f[j-v[i]][k-g[i]]+c[i]);
- }
- }
- }
- printf("%d\n",f[n][m]);
- return ;
- }
话说上回他给女孩送了n件礼物,由于是廉价的所以全部都坏掉了,女孩很在意这些礼物,所以决定自己缝补,但是人生苦短啊,女孩时间有限,她总共有m分钟能去缝补礼物。由于损坏程度不一样所以缝补的时间p也是不一样的,每件礼物呢,都有一个女孩的喜爱程度为w,后面还有一个数字h为这种礼物的件数。女孩想让自己的喜爱程度的和最大,那么请聪明的你帮她算一算!(注意:礼物非常多,不一定都能缝补完,女孩也不用把所有时间都花费)
第1行2个整数 m,n
第2行到第n+1行 每行三个整数 p,w,h
一个整数s表示最大的喜爱程度
8 2
2 100 4
4 100 2
400
m<=10000
n<=100
p,h,w<=6000
- #include<cstdio>
- #include<iostream>
- using namespace std;
- #define N 10100
- int v[N],c[N],s[N],f[N],n,m;
- int main(){
- scanf("%d%d",&m,&n);
- for(int i=;i<=n;i++){
- scanf("%d%d%d",v+i,c+i,s+i);
- }
- for(int i=;i<=n;i++){
- for(int j=m;j>=;j--){
- for(int k=;k<=s[i];k++){
- if(j-k*v[i]<) break;
- f[j]=max(f[j],f[j-k*v[i]]+k*c[i]);
- }
- }
- }
- printf("%d\n",f[m]);
- return ;
- }
二进制优化
- #include<cstdio>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- #define N 10010
- int e[],v[N],c[N],f[N],m,n,n1;
- int main(){
- for(int i=;i<=;i++) e[i]=<<i;
- scanf("%d%d",&m,&n);
- for(int i=,x,y,s;i<=n;i++){
- scanf("%d%d%d",&x,&y,&s);
- int t=;
- while(s>=e[t]){
- v[++n1]=x*e[t];
- c[n1]=y*e[t];
- s-=e[t++];
- }
- if(s){
- v[++n1]=x*s;
- c[n1]=y*s;
- }
- }
- for(int i=;i<=n1;i++){
- for(int j=m;j>=v[i];j--){
- f[j]=max(f[j],f[j-v[i]]+c[i]);
- }
- }
- printf("%d\n",f[m]);
- return ;
- }
这里简直是吃货的天堂,小吃太多了。数不胜数。
假设岛上有N种小吃,每种体积Vi,美味度Wi。
设某吃货旅行者的食量C,求他能吃到食品的最大美味度。
两个正整数N C
N个正整数,Vi
N个正整数,Wi
最大美味值
4 10
2 5 1 9
10 24 1 100
101
N<=100,C<=10000,Vi,Wi<=1000
可以DP,可以DFS
背包归类:01背包
- #include<cstdio>
- #include<iostream>
- using namespace std;
- #define N 10100
- int v[N],c[N],f[N],n,m;
- int main(){
- scanf("%d%d",&n,&m);
- for(int i=;i<=n;i++) scanf("%d",v+i);
- for(int i=;i<=n;i++) scanf("%d",c+i);
- for(int i=;i<=n;i++){
- for(int j=m;j>=v[i];j--){
- f[j]=max(f[j],f[j-v[i]]+c[i]);
- }
- }
- printf("%d\n",f[m]);
- return ;
- }
codevs2894、2837、1669、2503、3231的更多相关文章
- 教你一招:解决win10/win8.1系统在安装、卸载软件时出现2502、2503错误代码的问题
经常遇到win10/win8.1系统在安装.卸载软件时出现2502.2503错误代码的问题. 解决办法: 1.打开任务管理器后,切换到“详细信息”选项卡,找到explore.exe这个进程,然后结束进 ...
- CSS3与页面布局学习总结(二)——Box Model、边距折叠、内联与块标签、CSSReset
一.盒子模型(Box Model) 盒子模型也有人称为框模型,HTML中的多数元素都会在浏览器中生成一个矩形的区域,每个区域包含四个组成部分,从外向内依次是:外边距(Margin).边框(Border ...
- C#、JAVA操作Hadoop(HDFS、Map/Reduce)真实过程概述。组件、源码下载。无法解决:Response status code does not indicate success: 500。
一.Hadoop环境配置概述 三台虚拟机,操作系统为:Ubuntu 16.04. Hadoop版本:2.7.2 NameNode:192.168.72.132 DataNode:192.168.72. ...
- Map集合及与Collection的区别、HashMap和HashTable的区别、Collections、
特点:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值. Map集合和Collection集合的区别 Map集合:成对出现 (情侣) ...
- 兼容8事件绑定与解绑addEventListener、removeEventListener和ie的attachEvent、detachEvent
兼容8事件绑定与解绑addEventListener.removeEventListener和ie的attachEvent.detachEvent ;(function(){ // 事件绑定 bi ...
- TFS API:三、TFS WorkItem添加和修改、保存
TFS API:三.TFS WorkItem添加和修改.保存 WorkItemStore:表示跟踪与运行 Team Foundation Server的服务器的工作项客户端连接. A.添加工作项 1 ...
- C#与Java对比学习:类型判断、类与接口继承、代码规范与编码习惯、常量定义
类型判断符号: C#:object a; if(a is int) { } 用 is 符号判断 Java:object a; if(a instanceof Integer) { } 用 inst ...
- TCP 三次握手四次挥手, ack 报文的大小.tcp和udp的不同之处、tcp如何保证可靠的、tcp滑动窗口解释
一.TCP三次握手和四次挥手,ACK报文的大小 首先连接需要三次握手,释放连接需要四次挥手 然后看一下连接的具体请求: [注意]中断连接端可以是Client端,也可以是Server端. [注意] 在T ...
- Python学习笔记 之 递归、二维数组顺时针旋转90°、正则表达式
递归.二维数组顺时针旋转90°.正则表达式 1. 递归算法是一种直接或间接调用自身算法的过程. 特点: 递归就是在过程或函数里调用自身 明确的递归结束条件,即递归出口 简洁,但是不提倡 递归次数多 ...
- 【Go入门教程3】流程(if、goto、for、switch)和函数(多个返回值、变参、传值与传指针、defer、函数作为值/类型、Panic和Recover、main函数和init函数、import)
这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和 ...
随机推荐
- [Android] android:visibility属性应用
在Android开发中,有这样一种场景: 当edittext中有内容时候,旁边的提交或确定按钮显示: 当edittext中内容为空的时候,提交或确定按钮隐藏: 要实现起来其实并不困难.很多控件都有vi ...
- php解耦的三种境界
我们有三个类,Db,FileSystem,Session;实际业务需求要组合操作这三个类. 一.常规做法 class Db { public function read($id) { } } clas ...
- Git学习资源推荐
Git在线练习 http://pcottle.github.io/learnGitBranching/ https://try.github.io/levels/1/challenges/1 Git入 ...
- Ubuntu 11.04 (Natty) 已经停止支持 但可以使用old-releases源了
Ubuntu 11.04 (Natty) 已经停止支持,但可以使用old-releases源了,先备份源列表文件: sudo cp /etc/apt/sources.list /etc/apt/sou ...
- android开发中,在java中怎样使用c提供过来char*
这个char*假设是一般的字符串的话,作为string传回去就能够了.假设是含有'\0'的buffer,最好作为bytearray传出,由于能够制定copy的length.假设copy到string, ...
- hdu3415 Max Sum of Max-K-sub-sequence 单调队列
//hdu3415 Max Sum of Max-K-sub-sequence //单调队列 //首先想到了预处理出前缀和利用s[i] - s[j]表示(j,i]段的和 //之后的问题就转换成了求一个 ...
- Cron表达式中特殊字符解释
http://www.cnblogs.com/opaljc/archive/2012/05/24/2516392.htmlCron表达式的时间字段除允许设置数值外,还可使用一些特殊的字符,提供列表.范 ...
- MongoDB在Windows2003上安装配置及使用
本文档适用于MongoDB2.0.1版本在windows2003上的安装.配置,以及使用. 或者根据需要下载最新的稳定版本. 安装:将下载之后的压缩包解压到任意目录即可,本文假设解压到[D:\mong ...
- 使用swap 清空vector
//最简单的使用swap,清除元素并回收内存 vector <int>().swap(vecInt); //清除容器并最小化它的容量, // vecInt.swap(vector<i ...
- ELF解析(part one)
the contents class elf { //date structure Elf32_Ehdr ehdr; Elf32_Shdr shdr; Elf32_Phdr phdr; // void ...