#abc0142. [abc014_2]価格の合計
[abc014_2]価格の合計
问题描述
你正在购物,从商品列表中选择了一些商品。现在,你想要计算这些商品的总价格。
顺便说一下,存在一种用二进制表示任意集合的子集合的方法,可以在列举所有子集(组合)时使用for循环。
- 假设有 n 个商品,商品0,商品1,..,商品n-1。
- 用十进制整数 X 表示子集,并将其二进制表示为 b_{n-1}b_{n-2}...b_1b_0。其中,b_0 是最低位,b_{n-1} 是最高位。注意,允许头部有 0。
然后,使用该整数 X 的二进制表示来定义一个子集,如下所示:
- 如果 b_0=1,则集合包含商品0;如果 b_0=0,则集合不包含商品0。
- 如果 b_1=1,则集合包含商品1;如果 b_1=0,则集合不包含商品1。
- ...
- 如果 b_{n-1}=1,则集合包含商品 n-1;如果 b_{n-1}=0,则集合不包含商品 n-1。
例如,当 n=4,X=5 时,b=0101,子集为 {商品0, 商品2}。简单地说,在 X 的二进制表示中,如果第 k(k≥0) 位为 1,则表示包含第 k 个物品。是否某个位为 1 可以在许多编程语言中轻松判断,请自行查阅。
你的任务是,给定商品的数量、每个商品的价格以及表示子集的十进制整数 X,计算子集中包含的商品的总价格。
※虽然这个问题与直接相关,但是通过上述表示子集的方法,可以用连续的整数从0到2^n-1来表示集合大小为 n 的所有子集(包括空集),在枚举时可应用此方法。
输入
输入以以下格式从标准输入中给出。
...
- 第1行给出商品的数量 n (1 ≤ n ≤ 20) 和表示商品子集的十进制整数 X (0 ≤ X ≤ 2^{n}-1),两者之间用空格分隔。
- 第2行给出商品0 ~ n-1 的价格 $a_0,a_1,...,a_{n-1}(0 ≤ a_0,a_1,...,a_{n-1} ≤ 1,000)$,每个价格之间用空格分隔。
输出
- 输出部分子集包含的商品的总价格,输出末尾换行符。
输入例子1
4 5
1 10 100 1000
输出例子1
101
和 是问题描述中使用的值。子集为 {商品0, 商品2},所以总价格为 1 + 100 = 101。
输入例子2
20 1048575
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
输出例子2
210
X 的二进制表示为 11111111111111111111(有20个1),所以子集包含所有商品。
输入例子3
4 0
1000 1000 1000 1000
输出例子3
0
子集也可能是空集。