题目链接: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;
}

最新文章

  1. iOS开发之手势识别
  2. HTML5的Video标签的属性,方法和事件汇总
  3. redis pub/sub 实战: 微信语音识别
  4. python之路 之open
  5. web项目自动化测试方案预研
  6. 释放Linux磁盘空间的一种方法
  7. 查看Linux系统下Raid信息
  8. Swift笔记01
  9. 浅析=======Struts2之==========valueStack
  10. 如何在不使用系统函数的情况下实现PHP中数组系统函数的功能
  11. 如何理解iOS的“对象等同性”
  12. NEW —— Code
  13. BZOJ3737 : [Pa2013]Euler
  14. bitcoin 源码解析 - 交易 Transaction(三) - Script
  15. C# 四舍五入 保留两位小数(转载)
  16. 利用Python爆破数据库备份文件
  17. move操作
  18. Maven根据不同环境打包不同配置文件
  19. 在 Sublime Text 2 下开启 Vim 模式
  20. nginx跟tp5无法加载控制器

热门文章

  1. codeforces #364d As Fast As Possible
  2. [译]GLUT教程 - 整合代码2
  3. 关于ViewData,ViewBag,TempData三者学习记录!
  4. Prometheus+Grafana搭建监控系统
  5. HBase概念及表格设计
  6. ios - 使用@try、catch捕获异常:
  7. Zookeeper Curator 事件监听 - 秒懂
  8. 【学员管理系统】0x04 数据库连接优化
  9. Dubbo,ZooKeeper,Redis,FastDFS,ActiveMQ,Keepalived,Nginx,Hudson
  10. linux c编程:进程控制(二)_竞争条件