Description
游戏的主人公有 n 个魔法,每个魔法分为若干个等级,第 i 个魔法有 p[i] 个等级(不包括 0),每个魔法的每个等级都有一个效果值,一个 j 级的 i 种魔法的效果值为 w[i][j],魔法升一级需要一本相应的魔法书,购买魔法书需要金币,第 i 个魔法的魔法书价格为 c[i],而小x只有 m 个金币(好孩子不用修改器)。
你的任务就是帮助小x决定如何购买魔法书才能使所有魔法的效果值之和最大,开始时所有魔法为 0 级效果值为 0。
Format
Input
第一行用空格隔开的两个整数 n,m。
以下 n 行,描述 n 个魔法,第 i + 1 行描述第 i 个魔法。格式如下:
c[i] p[i] w[i][1] w[i][2] … w[i][p[i]]
Output
第一行输出一个整数,即最大效果值。
以后 n 行输出你的方案:
第 i + 1 行有一个整数 v[i],表示你决定把第 i 个魔法学到 v[i] 级。
如果有多解输出花费金币最少的一组。
如果还多解输出任意一组。
Samples
输入数据 1
3 10
1 3 1 2 2
2 3 2 4 6
3 3 2 1 10
输出数据 1
11
1
0
3
Limitation
对于 100% 的数据,0 < n ≤ 100,0 < m ≤ 500,0 < p[i] ≤ 50,0 < c[i] ≤ 10,保证输入数据和最终结果在 longint 范围内。
浅浅谈一下
- 首先看到题目,第一反应就是
背包
! - 仔细看下,没有无限选,就不是
完全背包
- 再仔细看下,每个魔法有 p i p_i pi等级,每个等级所花费的钱和收获的钱都不一样
- 诶?怎么有点像
多重背包
有点小感觉 - 于是,我们第一个生成的思路就出来了
- 将每个魔法分成 p i p_i pi个物品,再做多重背包
- 诶?等下,有点问题
- 一个魔法可以选择多个等级吗?
- 并不能!说明了什么?
- 每个魔法分成的 p i p_i pi个物品互相排斥!
- 对于多组物品,每组物品互相排斥,只能挑一个,怎么做呢?
分组背包
应运而生!
分组背包
- 解决问题
有一个体积为 v v v的背包, n n n个物体,重量分别为 w 1 … … w n w_1……w_n w1……wn,价值分别为 c 1 … … c n c_1……c_n c1……c