准备搬家的小王有一个承重上限为 cap 的箱子,打算从 m 件随身用品中选出若干件带走。每件用品记录两项信息:
某些用品要搭配其他用品使用:若选了编号 p 的用品,就必须同时选上 parentp 指定的用品。每件用品最多指定一个前置对象,同一件用品也至多装入一次。请在重量不超过箱子承重的前提下,使取得的价值之和尽可能高。
首行按顺序给出 cap,m。
接着 m 行,每行是 costp,gainp,按编号从 0 至 m−1 描述各件用品。
末行包含 m 个整数,组成数组 parent。当 parentp=−1 时,该件没有前置对象;否则必须先选编号为 parentp 的那件。
打印所能取得的最高价值;可以不选任何用品。
范围:1≤m≤1000,1≤cap≤104,1≤costp≤cap,1≤gainp≤104。每个 parentp 为 −1 或 [0,m−1] 内与 p 不同的编号。
依赖允许跨越多层,但保证不存在环。若某件被选中,它的直接前置对象及继续向上的所有前置对象都必须选中。这一无环条件用于补全图片中未明确的输入保证。
输入
7 4
3 5
2 6
4 8
1 2
-1 0 -1 2
输出
13
说明
选择编号 2,3 的价值为 10;选择 0,1 的价值为 11。选择 0,2 恰重 7,取得价值 13,为唯一最优集合。
输入
3 2
3 2
1 9
-1 0
输出
2
说明
编号 1 若入箱,就必须同时带上编号 0,总重 4 超限,因此只能选择编号 0 或不选,最优价值为 2。
Scan the QR code below with WeChat to sign in
设置一个用户名,下一步用微信扫码完成注册
请使用微信扫描下方二维码完成注册