Codeforces Round #178 (Div. 2) B. Shaass and Bookshelf —— DP
题目链接:http://codeforces.com/contest/294/problem/B
1 second
256 megabytes
standard input
standard output
Shaass has n books. He wants to make a bookshelf for all his books. He wants the bookshelf's dimensions to be as small as possible.
The thickness of the i-th book is ti and
its pages' width is equal to wi.
The thickness of each book is either 1 or 2.
All books have the same page heights.

Shaass puts the books on the bookshelf in the following way. First he selects some of the books and put them vertically. Then he puts the rest of the books horizontally above the vertical books. The sum of the widths of the horizontal books must be no more
than the total thickness of the vertical books. A sample arrangement of the books is depicted in the figure.

Help Shaass to find the minimum total thickness of the vertical books that we can achieve.
The first line of the input contains an integer n, (1 ≤ n ≤ 100).
Each of the next n lines contains two integers ti and wi denoting
the thickness and width of the i-th book correspondingly, (1 ≤ ti ≤ 2, 1 ≤ wi ≤ 100).
On the only line of the output print the minimum total thickness of the vertical books that we can achieve.
5
1 12
1 3
2 15
2 5
2 1
5
3
1 10
2 1
2 4
3
题解:
数据范围很小,所以可以直接开三维数组。
1.dp[i][j][k]表示:第i本书,下面为j, 上面为k的状态是否存在。
2.对于每一个已经存在的状态,再去判断当前的书是否可以放上去。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const double eps = 1e-6;
const int INF = 2e9;
const LL LNF = 9e18;
const int mod = 1e9+7;
const int maxn = 100+10; int n;
int w[maxn], t[maxn];
int dp[maxn][maxn<<1][maxn<<1]; int main()
{
scanf("%d",&n);
int sum = 0;
for(int i = 1; i<=n; i++)
scanf("%d%d", &t[i], &w[i]), sum += t[i]; dp[0][sum][0] = 1; //初始化全部放在下面
for(int i = 1; i<=n; i++)
for(int j = sum; j>=0; j--)
for(int k = 0; k<=j; k++)
{
if(!dp[i-1][j][k]) continue; //如果放在下面的状态不存在,则直接退出 dp[i][j][k] = 1; //留在下面
if(j-t[i]>=k+w[i]) //放上去
dp[i][j-t[i]][k+w[i]] = 1;
} int ans = INF;
for(int j = sum; j>=0; j--)
for(int k = 0; k<=j; k++)
if(dp[n][j][k])
ans = min(ans,j);
cout<< ans <<endl;
return 0;
}
或者用记忆化搜索写:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const double eps = 1e-6;
const int INF = 2e9;
const LL LNF = 9e18;
const int mod = 1e9+7;
const int maxn = 100+10; int n;
int w[maxn], t[maxn];
int dp[maxn][maxn<<1][maxn<<1]; int dfs(int pos, int thi, int wid)
{
if(pos==n+1) return thi;
if(dp[pos][thi][wid]!=-1) return dp[pos][thi][wid]; if(thi-t[pos]>=w[pos]+wid)
return dp[pos][thi][wid] = min( dfs(pos+1, thi-t[pos], w[pos]+wid), dfs(pos+1, thi, wid) );
else
return dp[pos][thi][wid] = dfs(pos+1, thi, wid);
} int main()
{
scanf("%d",&n);
int sum = 0;
for(int i = 1; i<=n; i++)
scanf("%d%d", &t[i], &w[i]), sum += t[i]; memset(dp,-1,sizeof(dp));
cout<< dfs(1, sum, 0) <<endl;
return 0;
}
Codeforces Round #178 (Div. 2) B. Shaass and Bookshelf —— DP的更多相关文章
- Codeforces Round #178 (Div. 2) B .Shaass and Bookshelf
Shaass has n books. He wants to make a bookshelf for all his books. He wants the bookshelf's dimensi ...
- Codeforces Round #367 (Div. 2) C. Hard problem(DP)
Hard problem 题目链接: http://codeforces.com/contest/706/problem/C Description Vasiliy is fond of solvin ...
- Codeforces Round #178 (Div. 2)
A. Shaass and Oskols 模拟. B. Shaass and Bookshelf 二分厚度. 对于厚度相同的书本,宽度竖着放显然更优. 宽度只有两种,所以枚举其中一种的个数,另一种的个 ...
- Codeforces Round #369 (Div. 2) C. Coloring Trees(dp)
Coloring Trees Problem Description: ZS the Coder and Chris the Baboon has arrived at Udayland! They ...
- Codeforces Round #164 (Div. 2) E. Playlist 贪心+概率dp
题目链接: http://codeforces.com/problemset/problem/268/E E. Playlist time limit per test 1 secondmemory ...
- Codeforces Round #265 (Div. 1) C. Substitutes in Number dp
题目链接: http://codeforces.com/contest/464/problem/C J. Substitutes in Number time limit per test 1 sec ...
- Codeforces Round #290 (Div. 2) D. Fox And Jumping dp
D. Fox And Jumping 题目连接: http://codeforces.com/contest/510/problem/D Description Fox Ciel is playing ...
- Codeforces Round #221 (Div. 1) B. Maximum Submatrix 2 dp排序
B. Maximum Submatrix 2 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset ...
- Codeforces Round #355 (Div. 2) D. Vanya and Treasure dp+分块
题目链接: http://codeforces.com/contest/677/problem/D 题意: 让你求最短的从start->...->1->...->2->. ...
随机推荐
- k8s资源清单定义入门
1.资源分类 a.workload型资源:service.pod.deployment.ReplicaSet.StatefulSet.Job.Cronjob; b.服务发现及服务均衡资源型资源:Ser ...
- 2017 [六省联考] T2 相逢是问候
4869: [Shoi2017]相逢是问候 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1205 Solved: 409[Submit][Stat ...
- idea的快捷键和操作
IntelliJ Idea 常用快捷键列表 修改方法如下: 点击 文件菜单(File) –> 点击 设置(Settings… Ctrl+Alt+S), –> 打开设置对话框. 在左侧的 ...
- javascript --- 临时构造器F()
这篇内容也是之前讲到过的,纯属无聊,莫要见怪.~(- ̄▽ ̄)-~(- ̄▽ ̄)-~(- ̄▽ ̄)-~(- ̄▽ ̄)-~(- ̄▽ ̄)- 正如上文所说,如果所有的prototype属性都指向了一个相同的对象,父 ...
- Git安装及SSH Key管理之Mac篇
1.下载git客户端,下载地址为:https://git-scm.com/download/mac 2.打开安装包,可以看到此时的界面为: 我们需要把.pkg的安装包安装到系统当中.我双击了安装包 ...
- (学习笔记3)BMP位图的读取与显示
在(学习笔记2)中.我们已经具体说明怎样去创建MFC.在这节中.主要解决BMP位图照片的读取和显示问题. 我们新建一个projectdemo1.创建步骤请看(学习笔记2)中具体说明. 创建成功后,例如 ...
- Android pull to Refresh 导入出错?
今天在导入 PuultoResfresh 的时候老是出错. error: [2014-09-28 10:04:44 - library] Unable to resolve target 'andro ...
- oracle [union.minus.intersect]
union 两张表的相同字段的数据[记录类型和列数要一致],合并,并且去重 can replace with "in" (但是如果是两个不同的表而且没什么关联的话必须要union了 ...
- 笔记03 MVVM 开发的几种模式(WPF)
转自http://www.cnblogs.com/buptzym/p/3220910.html 在WPF系(包括SL,WP或者Win8)应用开发中,MVVM是个老生常谈的问题.初学者可能不会有感觉,但 ...
- oracle数据库 操作clob对象
clob类型,但对于这个类型处理起来还是比较麻烦的,varchar2长度为4000bytes,如果varchar2能满足楼主的需求,建议使用varchar2,下面提供了在Java 中读取clob类型的 ...