考虑建立一个二维数组 d p [ i ] [ j ] dp[i][j] dp[i][j]表示处理到第 i i i个作业,A的工作总时间为 j j j,B的工作时间。那么根据 0 − 1 0-1 0−1背包的思想, j j j的枚举范围可以是从0到A可能的总工作时间,枚举这里面的每个 j j j,不停填表,逐步得到答案
枚举 j j j,注意 j j j是 A A A的工作总时间,如果 j < a [ i ] j\lt a[i] j<a[i],说明 A A A不能处理第 i i i个作业,也不能不处理,所以只能由 B B B处理,那么有 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + b [ i ] dp[i][j]=dp[i-1][j]+b[i] dp[i][j]=dp[i−1][j]+b[i];否则,就说明既可以由 A A A处理,也可以由 B B B处理,取较小者,有 d p [ i ] [ j ] = m i n ( d p [ i − 1 ] [ j − a [ i ] ] , d p [ i − 1 ] [ j ] + b [ i ] ) dp[i][j]=min(dp[i-1][j-a[i]], dp[i-1][j]+b[i]) dp[i][j]=min(dp[i−1][j−a[i]],dp[i−1][j]+b[i]) 所以状态转移方程为 d p [ i ] [ j ] = { d p [ i − 1 ] [ j ] + b [ i ] j < a [ i ] m i n ( d p [ i − 1 ] [ j − a [ i ] ] , d p [ i − 1 ] [ j ] + b [ i ] ) j ≥ a [ i ] dp[i][j]=\begin{cases} dp[i-1][j]+b[i] &\text{} j\lt a[i] \\ min(dp[i-1][j-a[i]],dp[i-1][j]+b[i]) &\text{} j\geq a[i] \end{cases} dp[i][j]={
dp[i−1][j]+b[i]min(dp[i−1][j−a[i]],dp[i−1][j]+b[i])j<a[i]j≥a[i]
再仔细说一下这个状态转移方程, i i i表示到第几个作业了, j j j表示的是 A A A的工作总时间, d p [ i ] [ j ] dp[i][j] dp[i][j]表示 B B B的工作总时间,那么如果 j < a [ i ] j\lt a[i] j<a[i]说明 A A A工作总时间还没到 a [ i ] a[i] a[i],那么只能让 B B B做 a [ i ] a[i] a[i],那么B现在的总工作时间就是 d p [ i − 1 ] [ j ] + b [ i ] dp[i-1][j]+b[i] dp[i−1][j]+b[i],因为 A A A没工作,所以 j j j不用动;当 j ≥ a [ i ] j\geq a[i] j≥a[i]时,如果让 A A A来做,那么这个时候B的总工作时间应该是多少呢?因为现在是 A A A在做, A A A的工作时间是 j j j,那么B的工作时间就应该是 A A A没做时候的工作时间,也就是 j j j把现在的 a [ i ] a[i] a[i]去掉之后的dp值,即 d p [ i − 1 ] [ j − a [ i ] ] dp[i-1][j-a[i]] dp[i−1][j−a[i]],如果让 B B B来做,分析和第一个状态转移式一样
状态转移做完之后,枚举每一个 A A A的工作时间,将它和 B B B的工作时间对比取大的,更新答案(对于取大的这个分析在搜索那一块做过了,不再赘述),最后答案取最小值