Related
In following contests:
菜品数 k≤15,全部挑法只有 215=32768 种,直接枚举所有子集。
1. 子集表示
用二进制数 mask 表示一种挑法,第 j 位为 1 表示挑了第 j 道菜。每个子集要知道两件事:总价 total[mask],以及已覆盖的类别集合 cover[mask](4 位二进制,第 g−1 位为 1 表示挑到了类别 g)。
2. 递推
职工食堂新开了自选套餐。窗口今天一共摆出 k 道菜,编号为 j 的菜标价 cj 元,归属类别 gj。类别分成四种:1 代表主食,2 代表荤菜,3 代表素菜,4 代表汤。
从这 k 道菜里挑出一部分(同一道菜至多挑一回)就构成一份套餐,套餐要同时符合下面两条:
若两份套餐挑选的菜品集合有差别,就记为两份不同的套餐,哪怕二者总价一样。
请求出满足要求的套餐一共有几份,并找出这些套餐里最高的总价。
首行给出两个整数 k 与 M。
随后 k 行,每行两个整数 cj 和 gj,分别是第 j 道菜的标价和类别。
在一行内输出两个整数:符合要求的套餐份数,以及这些套餐里的最高总价。
倘若一份符合要求的套餐都没有,就输出 0 -1。
数据范围:
输入
6 24
5 1
8 2
6 2
4 3
7 3
3 4
输出
4 23
说明
把这 6 道菜按顺序叫作 A∼F。主食仅有 A,汤仅有 F,这两道必须挑上,花去 5+3=8 元,预算还剩 16 元。
荤菜能挑 {B}、{C} 或 {B,C};素菜能挑 {D}、{E} 或 {D,E}。把荤素两部分的花费逐个和 16 比较:
可行的套餐一共 4 份,最高总价是 23。
输入
4 10
3 1
4 2
2 3
2 4
输出
0 -1
说明
四个类别都只有一道菜,想凑齐四类只能全挑,总价 3+4+2+2=11,比预算 10 多,所以一份可行的套餐也没有。
In following contests:
Scan the QR code below with WeChat to sign in
设置一个用户名,下一步用微信扫码完成注册
请使用微信扫描下方二维码完成注册