Codeforces 294B Shaass and Bookshelf:dp

题目链接:http://codeforces.com/problemset/problem/294/B

题意:

  有n本书,每本书的厚度为t[i],宽度为w[i] (1<=t[i]<=2, 1<=w[i]<=100)。

  然后让你将所有书按照下面的方式摆放:

  

  在下面放一本书会占用下面t[i]的长度。

  在上面放一本书会占用上面w[i]的长度。

  最终要保证上面的总长度不超过下面的总长度。

  问你下面的总长度最小是多少。

题解:

  表示状态:

    dp[i][j] = min length

    表示已经放了前i本书,下面的总长度为j时,上面的最小总长度。

  找出答案:

    ans = min i (dp[n][i]<=i)

  如何转移:

    对于第i本书,要么放上面,要么放下面。

    dp[i][j] = min(dp[i-1][j]+w[i], dp[i-1][j-t[i]])

  边界条件:

    set dp = INF

    dp[0][0] = 0

AC Code:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #define MAX_N 105
 5 #define MAX_T 205
 6 #define INF 1000000000
 7
 8 using namespace std;
 9
10 int n;
11 int t[MAX_N];
12 int w[MAX_N];
13 int dp[MAX_N][MAX_T];
14
15 int main()
16 {
17     cin>>n;
18     for(int i=1;i<=n;i++)
19     {
20         cin>>t[i]>>w[i];
21     }
22     memset(dp,0x3f,sizeof(dp));
23     dp[0][0]=0;
24     int tot=0;
25     for(int i=1;i<=n;i++)
26     {
27         tot+=t[i];
28         for(int j=0;j<=tot;j++)
29         {
30             dp[i][j]=min(dp[i][j],dp[i-1][j]+w[i]);
31             if(j-t[i]>=0) dp[i][j]=min(dp[i][j],dp[i-1][j-t[i]]);
32         }
33     }
34     int ans=INF;
35     for(int i=0;i<=tot;i++)
36     {
37         if(dp[n][i]<=i) ans=min(ans,i);
38     }
39     cout<<ans<<endl;
40 }

原文地址:https://www.cnblogs.com/Leohh/p/8243829.html

时间: 2024-08-04 00:57:06

Codeforces 294B Shaass and Bookshelf:dp的相关文章

Codeforces 294B Shaass and Bookshelf(记忆化搜索)

题目 记忆化搜索(深搜+记录状态) 感谢JLGG //记忆话搜索 //一本书2中状态,竖着放或者横着放 //初始先都竖着放,然后从左边往右边扫 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int dp[110][210][210];//dp[第几个][厚度][宽度] int n; int a[110],b[110]; int rec(int i,int th,

codeforces 294B Shaass and Bookshelf

题意:给你n本书,你可以把它竖着摆放,然后也可以横着摆在竖着的书上面,但不能超过竖着摆放的边缘,且不可以堆叠.问你竖着摆放的最小宽度是多少. 解题思路:dp,dp[i][j] 代表 第i个 ,用竖着摆放为 j 的书横着摆放的最小值 解题代码: 1 /************************************************************ 2 * Author : darkdream 3 * Email : [email protected] 4 * Last mo

CodeForces 294B Shaass and Bookshelf 【规律 &amp; 模拟】或【Dp】

这道题目的意思就是排两排书,下面这排只能竖着放,上面这排可以平着放,使得宽度最小 根据题意可以得出一个结论,放上这排书的Width 肯定会遵照从小到大的顺序放上去的 Because the total thickness of vertical books is fixed it's good to calculate the minimum possible total width of horizontal books. 那么只需要模拟一遍放书的过程即可,不会TLE 不过正统解法是Dp Dp

Codeforces 294E Shaass the Great 树形dp(水

题目链接:点击打开链接 题意: 给定n个点的树,任意拆掉一条边,得到2个子树,再用刚拆掉的边把这两个子树连起来. 得到新的树,这个树的权值为任意两个点间的距离和. 使得新的树权值最小.输出这个权值. 枚举拆掉的边(u,v) 得到2个以u为根的子树和以v为根的子树 计算每条边对答案的贡献,拆掉的边贡献就是siz[u]*siz[v]*edge[u,v].dis 剩下的就是计算如何连接2个子树使得权值和最小. 对于子树中的一条边x, y,若已知两端的节点数为i,j,则这条边对答案的贡献就是 i*j*e

Codeforces 893E Counting Arrays:dp + 线性筛 + 分解质因数 + 组合数结论

题目链接:http://codeforces.com/problemset/problem/893/E 题意: 共q组数据(q <= 10^5),每组数据给定x,y(x,y <= 10^6). 问你有多少种长度为y,乘积为x的整数数列.(可以有负数) 题解: 首先考虑数列只有正整数的情况. 将x分解质因数:x = ∑ a[i]*p[i] 由于x较大,所以要先用线性筛求出素数,再枚举素数分解质因数. 那么一个乘积为x的数列可以看做,将x的所有∑ p[i]个质因子,分配到了y个位置上. 设f(i)

codeforces 277.5 div2 F:组合计数类dp

题目大意: 求一个 n*n的 (0,1)矩阵,每行每列都只有两个1 的方案数 且该矩阵的前m行已知 分析: 这个题跟牡丹江区域赛的D题有些类似,都是有关矩阵的行列的覆盖问题 牡丹江D是求概率,这个题是方案数,也比较相似.. 这种题中,因为只要求方案数..我们只要关注几行几列有几个1,而不必要关注具体的位置 题解: 行列都需要处理,因此考虑记录列的状态,然后一行一行的转移 最暴力的方程: dp[i][j][k][t] 表示已经确定了 i 行 有 j列已经有两个1,有k列只有一个1,有t列一个1也没

codeforces 148E Aragorn&#39;s Story 背包DP

Aragorn's Story Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/problem/148/E Description Our protagonist is the handsome human prince Aragorn comes from The Lord of the Rings. One day Aragorn finds a lot of enemies who

Codeforces 479E Riding in a Lift(dp)

题目链接:Codeforces 479E Riding in a Lift 题目大意:有一栋高N层的楼,有个无聊的人在A层,他喜欢玩电梯,每次会做电梯到另外一层.但是这栋楼里有个秘 密实验室在B层,所以每次他移动的时候就有了一个限制,x为当前所在层,y为目标层,|x - y| < |x - b|.问说移动K次 后,有多少不同的路径. 解题思路:dp[i][j]表示在第i步到达j层有多少种不同的路径,dis = abs(j-B) - 1,那么在[j-dis,j+dis]这个范围都能被转 移,除了j

CodeForces 21D Traveling Graph 状压dp+欧拉回路

题目链接:点击打开链接 题意: 给定n个点m条边的无向图 求从1点开始经过每条边至少一次最后回到1点的最小路程 显然就是找一条路径可重复的欧拉回路 思路: 首先对于欧拉回路的结论是:所有点的度数都为偶数 因为所有边至少经过一次,那么可以把题意转换成加最少多少条边使得图满足以上结论 而加的边目的是为了把奇度数转成偶度数,先floyd一下得到任意点间加边的最小花费 dp[i]表示状态i下度数都为偶数的最小花费. 状压dp,把i状态下,所有未选择的点中挑2个奇度数的转移即可. #include <cs