SP180 CONTPACK - How to pack containers
题目描述
工厂的产品被包装在圆柱形的盒子里。所有的盒子都有相同的底座。盒子的高度是非负整数是2的幂。所有箱子里装的都是同样的货物,但价值可能不同。早生产的商品比较便宜。管理部门决定先把最旧(最便宜)的商品优先出售。商品(指那些盒子)用集装箱从仓库运输。集装箱也是圆柱形的。每个集装箱的直径略大于一个盒子的直径,这样盒子就可以很容易地放进容器里。集装箱的高度是非负的2次幂(和盒子一样)。这个数字称为容器的尺寸。为了安全运输,集装箱应与箱子紧密包装,即放置在一个集装箱内的箱子的高度总和必须等于这个集装箱的高度。一套集装箱被送到了仓库。尝试使得每个集装箱都被恰好装满,且装入的产品的总价值最小
**任务**
为每次询问编写一个程序:
从仓库中读取盒子的描述(大小,价值)和集装箱的描述(给定大小的集装箱有多少);
检查是否所有的集装箱都能恰好被装满,如果是,计算包装进这些集装箱的货物的最小价值和。
输入格式
第一行,多测数 $t$。
在每次询问的第 $1$ 行中有一个整数 $n$,这是仓库中的盒子数量。
在每次询问的第 $2$ 到第 $n+1$ 行,每行包含两个非负整数,第一个数表示箱子大小 $v$ ( $v\leq1000$ ),第二个数表示价值 $w$ ( $w\leq10000$ )。
在每次询问的第 $n+2$ 行,一个整数 $q$,表示集装箱的尺寸数。
接下来的 $q$ 行,每行包含两个非负整数,第一个数表示集装箱大小,大小不大于1000,第二个数表示集装箱数量。最大集装箱数不大于5000。
输出格式
对于每个测试用例,你的程序应该仅输出一行:
如果不可能恰好装满所有集装箱,输出“No”。
否则输出一个整数,表示产品价值的最小值。
说明/提示
$1\leq n\leq 10000$