题意理解
选择若干奶牛,使得智商和 ≥0\geq 0≥0,情商和 ≥0\geq 0≥0,最大化智商与情商的总和。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
思路分析
把智商作为"费用",情商作为"价值",转化为01背包。
设 dp[j]dp[j]dp[j] 表示智商和恰好为 jjj 时,情商和的最大值。
由于智商可能为负,需要做偏移。智商范围 [−1000,1000][-1000, 1000][−1000,1000],N≤400N \leq 400N≤400,所以智商和范围 [−400000,400000][-400000, 400000][−400000,400000]。设偏移量 OFFSET=400000OFFSET = 400000OFFSET=400000。
状态转移(关键点):
* 若 s[i]≥0s[i] \geq 0s[i]≥0:逆序枚举(普通01背包)
* 若 s[i]<0s[i] < 0s[i]<0:正序枚举(保证每个物品只选一次)
边界条件:
* dp[OFFSET]=0dp[OFFSET] = 0dp[OFFSET]=0:不选任何牛,智商和为0,情商和为0
* 其他初始化为负无穷
答案: 对于所有 j≥0j \geq 0j≥0 且 dp[j+OFFSET]≥0dp[j + OFFSET] \geq 0dp[j+OFFSET]≥0,最大化 j+dp[j+OFFSET]j + dp[j + OFFSET]j+dp[j+OFFSET]
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
参考代码