【动态规划】叠放箱子问题(ssl 1640)

叠放箱子问题叠放箱子问题

Description

某港口有一批集装箱,将其编号,分别为1至N。每一个箱子的外型尺寸都是一样的,现在要将其中某些集装箱叠放起来,集装箱叠放的规则如下:

1)每个集装箱上最多只能直接叠放一个集装箱。

2)编号较小的集装箱不能放在编号较大的集装箱之上。

3)每个集装箱都给出了自身的重量和可承受的重量,每个集装箱之上的所有集装箱重量之和不得超过该集装箱的可承受的重量。

现在要求你编程,从中选出最多个集装箱,使之在满足以上条件的情况下叠放起来,即要求叠得尽可能地高。

Input

第一行是一个正整数N,表示共有N个集装箱(1≤ N ≤1000)。

以下共有N行,每行两个正整数,中间用空格分隔,分别表示每个集装箱的自身重量和可承受的重量,两个数均为小于等于3000。

Output

输出最多可叠放的集装箱总数。运行时间不超过去时10秒。

Sample Input

5

19 15

7 13

5 7

6 8

1 2

Sample Output

题目大意:

有n个箱子,每个箱子都有自己的编号,自身重量,可承受重量(输入第i+1行是编号为i的箱子自身重量和可承受重量),编号小的必须在编号大的下面,箱子上面只能直接放一个箱子,但上面的这个箱子上面还可以放箱子(例如下图是合法的),求最多可叠放多少个箱子

在这里插入图片描述


方法一方法一

用一个二维数组f[i][j]来表示第i个箱子到第n个箱子重量为j时箱子的最大数,然后从上往下从后往前一次推过来,最后再从f[1][i](i=0~6000)中选一个最大的即可

动态转移方程

f[i][j]=max{f[i+1][j]notselectif((j>=v[i])and(c[i]>=j−v[i]))f[i+1][j−v[i]]+1selectf[i][j]=max\left\{\begin{matrix} f[i+1][j]&&not select \\ if ((j>=v[i])and(c[i]>=j-v[i]))&f[i+1][j-v[i]]+1&select \end{matrix}\right.f[i][j]=max{f[i+1][j]if((j>=v[i])and(c[i]>=jv[i]))f[i+1][jv[i]]+1notselectselect

说明:

v为自身重量,c为可承受重量

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,ans,v[1002],c[1002],f[1002][6002];
int main()
{scanf("%d",&n);for (int i=1;i<=n;i++)scanf("%d%d",&v[i],&c[i]);memset(f,-127/3,sizeof(f));//初值f[n+1][0]=0;//初值for (int i=n;i>0;i--)for (int j=0;j<=6000;j++){f[i][j]=f[i+1][j];//不放if ((j>=v[i])&&(c[i]>=j-v[i]))//j>=v[i]是为了保证j-v[i]不为负数,c[i]>=j-v[i]是为了保证他可以承受上面的重量f[i][j]=max(f[i][j],f[i+1][j-v[i]]+1);//状态转移方程}for (int i=0;i<=6000;i++)ans=max(ans,f[1][i]);//取最大值printf("%d",ans);return 0;
}

方法二方法二

用f[i][j]来表示上面的i个箱子选j个箱子的最小值,然后每一层如果不放就直接等于上面的,如果放就要判断是否能承受上方箱子的重量,再加上当前重量去最小值

动态转移方程:

f[i][j]=min{f[i+1][j]notselectif(f[i+1][j−1]&lt;=c[i])f[i+1][j−1]+v[i]selectf[i][j]=min\left\{\begin{matrix} f[i+1][j]&amp;&amp;not select \\ if (f[i+1][j-1]&lt;=c[i])&amp;f[i+1][j-1]+v[i]&amp;select \end{matrix}\right.f[i][j]=min{f[i+1][j]if(f[i+1][j1]<=c[i])f[i+1][j1]+v[i]notselectselect

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,v[1005],c[1005],f[1005][1005],u;
int main()
{scanf("%d",&n);for (int i=1;i<=n;++i)scanf("%d%d",&v[i],&c[i]);for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)f[i][j]=2147483647/3;//初始化u=2147483647/3;f[n][1]=v[n];//初值for (int i=n-1;i>0;--i)//枚举第i个箱子for (int j=1;j<=n-i+1;++j)//枚举重量{f[i][j]=f[i+1][j];//不放就继承上一个的最小重量if (f[i+1][j-1]<=c[i])//判断是否能承受f[i][j]=min(f[i][j],f[i+1][j-1]+v[i]);//动态转移方程}for (int i=n;i>=0;--i)if (f[1][i]!=u)//若有变化及可输出{printf("%d",i);break;//退出,避免重复输出}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321426.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6、mybatis中的sql映射文件详解(1)

对于初学者&#xff0c;如果进行mybatis的学习呢&#xff1f;我总结了几点&#xff0c;会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点&#xff1b;当知道了为什么的时候就开始了解如何用的问题&#xff0c;如何使用my…

jzoj4050-寻宝游戏【二分,树状数组,LCA】

正题 题目链接:https://jzoj.net/senior/#contest/show/3017/1 题目大意 nnn个点的一棵树&#xff0c;mmm次操作&#xff0c;修改一个地方的宝藏。 每次操作后求拿完所以宝藏并回到原地的最小距离。 解题思路 显然起点在任何一个有宝藏的地方都是最优的&#xff0c;而且顺着…

Ubuntu 16.04+.Net Core+Docker+Nginx安装部署

前言最近公司的项目打算移植到.Net Core平台&#xff0c;所以调研了一下.Net Core在Linux下的安装部署。本篇文章会一步步的描述从安装到配置到部署的全部过程。在文章的结构和内容里&#xff0c;笔者借鉴了很多其他博文的内容&#xff0c;但感觉其他博文中都只是实现了一部分或…

【动态规划】加法最大 (ssl 1595)/乘积最大 (ssl 1007)

加法最大加法最大加法最大 Description 设有一个长度为n的数字字符串&#xff0c;分成k1个部份&#xff0c;使其k1部份相加的和为最大。例如&#xff1a;数字串’340670’&#xff0c;k1&#xff0c;其加法有 34067040673 340670704 3406701010 3406703476 34076034076 其最…

7、mybatis中的sql映射文件详解(2)

对于初学者&#xff0c;如何进行mybatis的学习呢&#xff1f;我总结了几点&#xff0c;会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点&#xff1b;当知道了为什么的时候就开始了解如何用的问题&#xff0c;如何使用my…

jzoj4051-序列统计【NTT】

正题 题目链接:https://jzoj.net/senior/#contest/show/3017/2 题目大意 求有多少个长度为nnn的序列使得 都是在集合SSS中的数这些数的乘积%mx\% mx%mx 解题思路 设fi,jf_{i,j}fi,j​表示长度为iii的序列&#xff0c;乘积为jjj的有多少个&#xff0c;显然有 fi,j∗w%mfi−1…

玩Docker只要浏览器就够了,PWD是个神奇的网站

本文是d4d系列的第9篇&#xff0c;在这一篇中给大家介绍一个学习Docker最为快捷高效的方式&#xff0c;你不需要自己搭建环境&#xff0c;也不用担心把自己的开发环境搞乱&#xff0c;你需要的只是一个浏览器&#xff0c;就可以立即开始学习Docker的常用命令&#xff1b;你甚至…

【树形DP】没有上司的晚会 (ssl 1607)

没有上司的晚会没有上司的晚会没有上司的晚会 Description Ural大学有N个职员&#xff0c;编号为1~N。他们有从属关系&#xff0c;也就是说他们的关系就像一棵以校长为根的树&#xff0c;父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会&#xff0c…

8、mybatis中的sql映射文件详解(3)

对于初学者&#xff0c;如何进行mybatis的学习呢&#xff1f;我总结了几点&#xff0c;会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点&#xff1b;当知道了为什么的时候就开始了解如何用的问题&#xff0c;如何使用my…

P3159-[CQOI2012]交换棋子【费用流】

正题 题目链接:https://www.luogu.com.cn/problem/P3159 题目大意 n∗mn*mn∗m的棋盘&#xff0c;每个格子有黑子或白子&#xff0c;每次可以交换两个位置的棋&#xff0c;给出起始态和最终态和每个格子参与交换的最多次数。 求最少交换次数。 解题思路 这里只把白色棋子算作…

[系统安全]使用OD编写连连看外挂

文档下载地址&#xff1a;https://pan.baidu.com/s/1hrzzerq

2018 .NET开发者调查报告: .NET Core 是怎么样的状态

4月28日&#xff0c;在公众号里发起《.NET Core 使用调查》&#xff0c;该调查为期一周&#xff0c;有近3300名开发者参与&#xff0c;统计下结果供你的决策参考。已经使用.net core 的人数只有44%&#xff0c;计划使用.net core 比例达到48%&#xff0c; 没有计划去使用.net …

【动态规划】【递归】取数字问题 (ssl 1644)

取数字问题取数字问题取数字问题 Description 给定M*N的矩阵&#xff0c;其中的每个元素都是-10到10之间的整数。你的任务是从左上角&#xff08;1&#xff0c;1&#xff09;走到右下角&#xff08;M&#xff0c;N&#xff09;&#xff0c;每一步只能向右或向下&#xff0c;并…

9、mybatis中动态sql的使用

对于初学者&#xff0c;如何进行mybatis的学习呢&#xff1f;我总结了几点&#xff0c;会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点&#xff1b;当知道了为什么的时候就开始了解如何用的问题&#xff0c;如何使用my…

软件质量保证划重点期末复习总结

软件质量保证复习总结大纲及问题 Module1 《软件工程实践》 1、软件工程实践通过解决问题的根源来指导软件开发。 2、软件工程实践之间相辅相成。 3、过程指导一个团队在什么时候做什么以及如何做。 4、软件工程过程为实现软件工程实践提供了上下文和支持。 Module2 《软件…

P4721-[模板]分治FFT【NTT,分治】

正题 题目链接:https://www.luogu.com.cn/problem/P4721 题目大意 给出序列ggg&#xff0c;然后f01f_01f0​1 fi∑j1ifi−jgjf_{i}\sum_{j1}^if_{i-j}g_jfi​j1∑i​fi−j​gj​ 求序列fff 解题思路 使用分治后用NTTNTTNTT计算前区间对后区间的贡献即可。 时间复杂度O(nlo…

Microsoft Build 2018 直播来啦!

一年一度的Microsoft Build大会又来啦&#xff01;Microsoft Build是微软面向全球开发者、合作伙伴以及消费者介绍其重要产品在未来一年内发展方向的技术盛会。而今年的Microsoft Build 2018大会是微软巨大蜕变、最彻底组织变革后的第一次前沿技术大会。更多了解&#xff0c;请…

【动态规划】矩阵链相乘 (ssl 1596)/能量项链 (ssl 2006)

矩阵链相乘{\color{Cyan} 矩阵链相乘 }矩阵链相乘 Description Input n表示矩阵的个数(<100) n1个数,表示矩阵(<100) Output 最小的乘法次数 Sample Input 5 5 10 4 6 10 2 Sample Output 348 题目大意&#xff1a; 有n个矩阵&#xff0c;输入n1个数&#x…

10、mybatis中缓存的使用

对于初学者&#xff0c;如何进行mybatis的学习呢&#xff1f;我总结了几点&#xff0c;会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点&#xff1b;当知道了为什么的时候就开始了解如何用的问题&#xff0c;如何使用my…

C#编译器优化那点事

使用C#编写程序&#xff0c;给最终用户的程序&#xff0c;是需要使用release配置的&#xff0c;而release配置和debug配置&#xff0c;有一个关键区别&#xff0c;就是release的编译器优化默认是启用的。优化代码开关即optimize开关&#xff0c;和debug开关一起&#xff0c;有以…