Codeforces 294B Shaass and Bookshelf:dp
2024-08-28 22:12:22
题目链接: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:
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 105
#define MAX_T 205
#define INF 1000000000 using namespace std; int n;
int t[MAX_N];
int w[MAX_N];
int dp[MAX_N][MAX_T]; int main()
{
cin>>n;
for(int i=;i<=n;i++)
{
cin>>t[i]>>w[i];
}
memset(dp,0x3f,sizeof(dp));
dp[][]=;
int tot=;
for(int i=;i<=n;i++)
{
tot+=t[i];
for(int j=;j<=tot;j++)
{
dp[i][j]=min(dp[i][j],dp[i-][j]+w[i]);
if(j-t[i]>=) dp[i][j]=min(dp[i][j],dp[i-][j-t[i]]);
}
}
int ans=INF;
for(int i=;i<=tot;i++)
{
if(dp[n][i]<=i) ans=min(ans,i);
}
cout<<ans<<endl;
}
最新文章
- iOS开发之手势识别
- HTML5的Video标签的属性,方法和事件汇总
- redis pub/sub 实战: 微信语音识别
- python之路 之open
- web项目自动化测试方案预研
- 释放Linux磁盘空间的一种方法
- 查看Linux系统下Raid信息
- Swift笔记01
- 浅析=======Struts2之==========valueStack
- 如何在不使用系统函数的情况下实现PHP中数组系统函数的功能
- 如何理解iOS的“对象等同性”
- NEW —— Code
- BZOJ3737 : [Pa2013]Euler
- bitcoin 源码解析 - 交易 Transaction(三) - Script
- C# 四舍五入 保留两位小数(转载)
- 利用Python爆破数据库备份文件
- move操作
- Maven根据不同环境打包不同配置文件
- 在 Sublime Text 2 下开启 Vim 模式
- nginx跟tp5无法加载控制器
热门文章
- codeforces #364d As Fast As Possible
- [译]GLUT教程 - 整合代码2
- 关于ViewData,ViewBag,TempData三者学习记录!
- Prometheus+Grafana搭建监控系统
- HBase概念及表格设计
- ios - 使用@try、catch捕获异常:
- Zookeeper Curator 事件监听 - 秒懂
- 【学员管理系统】0x04 数据库连接优化
- Dubbo,ZooKeeper,Redis,FastDFS,ActiveMQ,Keepalived,Nginx,Hudson
- linux c编程:进程控制(二)_竞争条件