啊,dp,万恶的dp。
本来不想补的,被某人押着说div3这么可以不ak于是不得不补了。真是痛苦的经历。(笑)
题目链接:https://codeforces.com/problemset/problem/1203/F2
题目大意:给定任务个数n和初始值r,完成每个任务需要有ai的r值,完成后r值会改变bi,问最多能完成多少任务(要保证最后r>=0)
思路:首先如果是正值的话自然按照a从小到大排一遍能加的都加上,然后问题在于负值。贪心显然不行,或者说这其实就是个背包问题的轻度转换,首先要做的预处理是对于bi为负值的第i项任务,它的ai=max(ai,-bi)这样才能保证完成这个任务后r不小于0,。然后就是dp,对于dp[i][j],我们认为它代表的是r值为j时,做到第i个任务为止(i已做)完成的最多任务数。那么,假设第i个能做,状态转移方程就是dp[i+1][j+aa[i].delt]=max(dp[i+1][j+aa[i].delt],dp[i][j]+1),aa储存的是所有的负值任务(已排序),这个方程的意思就是,假设能做,那就任务数+1,否则就在下个判断中补回这个任务消耗的r值。
代码如下:
1 #include<set>
2 #include
3 #include<string.h>
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include