描述

现有n个任务,要交给A和B完成。每个任务给A或给B完成,所需的时间分别为ai和bi。问他们完成所有的任务至少要多少时间。

输入

第一行一个正整数n,表示有n个任务。接下来有n行,每行两个正整数ai,bi。

输出

一个数,他们完成所有的任务至少要的时间。

输入样例 1

3
5 10
6 11
7 12

输出样例 1

12

提示

【输入输出样例解释】

A完成任务1和任务2,时间为11。B完成任务3,时间为12。

或者A完成任务1和任务3,时间为12。B完成任务2,时间为11。

一看题目感觉很简单

最普通的写法就是三维的  然后用背包写法     但是会 超时

可以进行降维处理!!

dp[i][j]表示  第i项任务   a的时间是j  b的时间是dp!!!  太强大了QAQ

#include<bits/stdc++.h>
using namespace std;
//input
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m);
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define LL long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define N 10005
int a[N];
int b[N];
int dp[N][N];
int main()
{
int n;
RI(n);
rep(i,,n)
RII(a[i],b[i]);
long sum=;
rep(i,,n)
{
sum+=a[i];
rep(j,,sum)
{
dp[i][j]=dp[i-][j]+b[i];//先让b来做试试
if(j>=a[i])dp[i][j]=min(dp[i][j],dp[i-][j-a[i]]);//再加上a来比对 哪个时间短
}
}
int minn=0x3f3f3f3f;
rep(i,,sum)
minn=min(minn,max(i,dp[n][i]));//注意求极值的写法
cout<<minn;
}

最新文章

  1. Js IP转数字
  2. Android开发-之环境的搭建
  3. BZOJ3513: [MUTC2013]idiots
  4. 常用的I/O流类型
  5. 重温《js权威指南》 第4、5、6章
  6. 深入理解Java内存模型(四)——volatile
  7. 多线程&amp;多进程解析:Python、os、sys、Queue、multiprocessing、threading
  8. Memcached 安装及配置
  9. 使用异步 I/O 大大提高应用程序的性能
  10. Kali-Linux之开启ssh服务
  11. Java GC - 监控回收行为与日志分析
  12. BZOJ 3697: 采药人的路径 [点分治] [我想上化学课]
  13. UGUI背包系统
  14. Promise实现ajax
  15. 微软Power BI 每月功能更新系列——5月Power BI 新功能学习
  16. jquery写tab切换,三行代码搞定
  17. .net core下的dotnet全局工具
  18. kettle教程一
  19. VMware vSphere学习之手动克隆虚拟机
  20. Composer的下载安装

热门文章

  1. 20155334 2016-2017-2 《Java程序设计》第九周学习总结
  2. Elastic Job入门(2) - 使用
  3. 【洛谷P1896【SCOI2005】】互不侵犯King
  4. tr 设置margin、padding无效
  5. Shiro+Spring+SpringMVC+Mybatis整合
  6. Androidstudio中jar包重复或jar包里的类重复问题
  7. java中的基本数据类型一定存储在栈中吗?
  8. struct 与 class 的区别
  9. c# WinFo判断当前程序是否已经启动或存在的几种方式
  10. 【转】CString与string、char*的区别和转换