任务分配(dp)

简介: 任务分配(dp)

任务分配(dp)

Description

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

Input

第一行一个正整数nn,表示有n个任务。

接下来有n行,每行两个正整数ai,bi。

Output

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

Samples

Input

3
5 10
6 11
7 12

Output

12

Hint

【输入输出样例解释】

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

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

【限制】

30%的数据满足:1≤n≤20

100%的数据满足:1≤n≤200, 1≤ai,bi≤200


思路:


三维dp比较好推,但是时间空间不允许。


正解是一种比较奇怪的dp状态。


dp[i] [j]的含义为完成前i个任务,A花费的时间为j;


dp[i] [j]的值表示完成前i个任务,B花费的时间。


划分依据为第i个任务由A还是B完成。


代码:

const int maxn=210;
int dp[maxn][maxn*maxn];
int a[maxn],b[maxn],n;
void solve(){
  n=read();
  for(int i=1;i<=n;i++){
    a[i]=read(),b[i]=read();
  }
  memset(dp,0x3f,sizeof dp);
  dp[0][0]=0;
  int sum=0;
  for(int i=1;i<=n;i++){
    sum=sum+a[i];
    for(int j=0;j<=sum;j++){
      dp[i][j]=dp[i-1][j]+b[i];//b完成第i个任务 
      if(j>=a[i]) dp[i][j]=min(dp[i][j],dp[i-1][j-a[i]]);//a完成第i个任务 
    }
  }
  int res=0x3f3f3f3f;
  for(int i=0;i<=sum;i++)///可能需要的时间 
    res=min(res,max(i,dp[n][i]));///注意取的先后顺序 
  cout<<res<<endl;
}

参考

目录
相关文章
|
1月前
|
算法
【算法】—— 简单多状态 dp 问题
【算法】—— 简单多状态 dp 问题
|
1月前
流(树形dp,换根dp)
流(树形dp,换根dp)
18 0
|
1月前
|
消息中间件 Kubernetes JavaScript
动态规划-区间、计数类DP问题总结
动态规划-区间、计数类DP问题总结
|
8月前
|
算法
求最大连续子段和 的 dp算法
对于这样的问题,我们可以直接用暴力,一个双重循环,虽说可以,但也没有更高明的方法? 我们再分析这个问题,如果我们知道了某个数前面一段数的和,我们就该考虑把这个数加入到前一段,还是重新开始一段。这个地方很重要,如果前一段的和小于0,我们重新建一段,反之加到前一段。这样我们就可以把n个数分成几段了,且每一段都求出了他们的和,然后再循环一次求出最大的一个和,我们就得到想要的结果了,也可以在分段的时候直接求结果。
30 0
|
25天前
|
Shell 网络安全
【错题集-编程题】mari和shiny(动态规划-多源状态线性 dp)
【错题集-编程题】mari和shiny(动态规划-多源状态线性 dp)
|
1月前
计数dp之整数划分
计数dp之整数划分
|
1月前
|
算法 测试技术 C++
【动态规划 状态机dp 性能优化】3098. 求出所有子序列的能量和
【动态规划 状态机dp 性能优化】3098. 求出所有子序列的能量和
【动态规划 状态机dp 性能优化】3098. 求出所有子序列的能量和
|
1月前
|
算法 测试技术 C#
【状态机dp 状态压缩 分组】1994. 好子集的数目
【状态机dp 状态压缩 分组】1994. 好子集的数目
|
1月前
距离和(换根dp)
距离和(换根dp)
21 0
|
7月前
|
人工智能
【DP练习】月饼盒(提高版)(vijos1255)
【DP练习】月饼盒(提高版)(vijos1255)
32 0

热门文章

最新文章