题意:
有若干工作集合,每个集合有三种类型:集合中的工作至少完成一项;至多完成一项;随意完成。
每种工作都有花费的时间和完成后的幸福度。
问某时间内完成任务最大的幸福度。
思路:
显然题意中有三种背包,找到状态转移方程问题就很简单。
设dp[i, j],表示第i个集合,时间为j的最大幸福度。
集合从1开始,为了避免出现跨第一种集合完成任务的情况,将dp初始化为负无穷,并将dp[0, j]初始化为0(不同的写法初始化方法可能略不同)
1.至少一项:
当该组只完成一项时,状态是由上一个集合转移而来;当该组完成若干项时,状态由该组转移过来。
所以状态转移方程是dp[i, j] = max(dp[i, j], dp[i -1, j - cost] + val, dp[i, j - cost] + val)
2.至多一项:
当不完成该组工作时,状态显然应该继承前一组;完成一项工作应该是从前一组状态转移而来。
所以状态转移方程是dp[i, j] = max(dp[i, j], dp[i - 1, j - cost] + val),但是要先复制前一组状态,因为状态是从前一组转移而来的。
3.01背包:
这个不用多说,就是一维0