在计算机科学中,0/1 背包问题是一个经典的挑战:给定一组物品,每个物品都有重量和价值,选择一个物品子集,使得总重量不超过给定的限制,且总价值尽可能大。
这个问题是 NP-hard 的。当重量范围相对较小时,可以使用著名的动态规划算法精确求解。然而,当重量和价值的范围都非常大时(例如达到 $10^9$),则需要启发式方法来获得较好的(但不一定是最优的)解。
两位研究人员 Alice 和 Bob 正在研究简单且快速的“启发式”算法,这些算法在处理此类大规模背包问题实例时能提供不错的结果。他们每个人都使用了一种贪心策略:
- Alice 的策略:最轻优先 (Lightest First)。Alice 希望让背包尽可能轻。她将所有物品按重量升序排序。如果两个物品重量相同,她按原始索引升序打破僵局。然后她选取该排序列表的前缀:她逐个选取物品,直到按顺序排列的下一个物品无法放入剩余容量为止。
- Bob 的策略:最高价值优先 (Best Value First)。Bob 希望获得最大的价值。他将所有物品按价值降序排序。如果两个物品价值相同,他按原始索引升序打破僵局。然后他遍历此列表。对于每个物品,如果它能放入剩余容量中,他就选取它;否则,他跳过该物品并继续处理后续物品。
现在,Alice 和 Bob 得到了一个包含 n 个物品的数据集(索引从 $1$ 到 $n$)和一个容量为 $W$ 的背包。然而,部分数据缺失了。对于每个物品,其重量 $w_i$ 和价值 $r_i$ 均已给出,但每个物品最多只有一个数值可能是未知的。
你的任务是为每个未知数值分配一个正整数,使得 Alice 选择的物品集合与 Bob 选择的物品集合完全相同(不考虑选择的顺序)。
输入格式
第一行包含一个整数 $T$ ($1\leq T\leq 100$),表示测试用例的数量。
对于每个测试用例:
第一行输入两个整数 $n,W$ ($1\leq n\leq 3000, 1\leq W\leq 10^9$),分别表示物品数量和背包容量。
第二行包含 n 个整数 $w_1, w_2, \cdots, w_n$ ($0\leq w_i\leq 10^9$),表示物品的重量。如果 $w_i=0$,则该参数未知。
第三行包含 n 个整数 $r_1, r_2, \cdots, r_n$ ($0\leq r_i\leq 10^9$),表示物品的价值。如果 $r_i=0$,则该参数未知。保证对于每个物品,最多只有一个数值未知。
保证所有测试用例的 $\sum n\leq 3000$。
输出格式
对于每个测试用例,如果存在一种合法的正整数分配方案,使得 Alice 和 Bob 选择的物品集合相同,则在第一行打印 Yes。然后在第二行打印所有 $w_i$ ($1\leq w_i\leq 10^9$),第三行打印所有 $r_i$ ($1\leq r_i\leq 10^9$),中间用空格分隔,表示一种可能的合法赋值。否则,在单行内打印 No。
请注意,$w_i$ 和 $r_i$ 的最大限制均为 $10^9$,与输入限制相同。Yes 或 No 是不区分大小写的。
样例
输入 $1$
6 3 5 0 2 3 2 4 0 3 5 2 3 0 4 0 2 3 1000000000 0 0 1000000000 2 3 1 5 1 0 1 1 1 0 3 8 0 7 9 5 1000000000 0 0 0 1 0 1 9 3 9 10 3 1000000000 500000001 500000000 0 1000000000 999999998 1
输出 $1$
Yes 3 2 3 2 4 1 Yes 2 3 2 4 1 2 Yes 1000000000 999999999 1000000000 2 3 1 Yes 1000000000 1 1 1 1000000000 3 8 1 7 9 Yes 1000000000 1000000000 1000000000 1 999999999 1 9 3 9 10 No
提示
对于第一个样例测试用例,Alice 依次选择了第二个物品和第一个物品;Bob 也选择了第二个物品和第一个物品。
对于第二个样例测试用例,Alice 和 Bob 都选择了第一个和第三个物品。
对于最后一个样例测试用例,不存在解决方案。