AT_arc017_3 [ARC017C] 無駄なものが嫌いな人

题目描述

我讨厌无用的东西,所以只说我想说的,不说废话。 世上有一种叫做“背包问题”的东西,就是考虑如何把物品装进一个固定大小的背包,使得价值尽可能高,但我觉得考虑这些都是无用的。 即使价值再高,如果背包里出现了多余的空间,我也无法容忍。我讨厌无用的东西。 现在,这里有一个大小为 $X$ 的背包和 $N$ 个物品。 第 $i$ 个物品的大小为 $w_i$。至于物品的价值,考虑也没用,所以忽略不计。 有多少种方法可以装物品,使得背包里没有多余的空间呢? 也就是说,从 $N$ 个物品中选出若干个,使得它们的大小之和恰好等于 $X$,有多少种选法? 我一开始想用手算这个问题,但发现这是一种无用的手段,所以决定拜托你来做。 请写一个没有无用计算时间的程序来解决这个问题,帮我节省无用的时间。 输入通过标准输入按以下格式给出。 > $N$ $X$ > $w_1$ > $w_2$ > $\vdots$ > $w_N$ - 第 1 行给出表示物品个数的整数 $N\ (1\leq N\leq 32)$ 和表示背包大小的整数 $X\ (1\leq X\leq 10^9)$,两者以半角空格分隔。 - 第 2 行到第 $N$ 行,每行给出一个物品的大小。第 $i$ 行为第 $i$ 个物品的大小 $w_i\ (1\leq w_i\leq 5\times 10^7)$。 请输出一个整数,表示从 $N$ 个物品中选出若干个,使得它们的大小之和恰好等于 $X$ 的选法数。 例如: ``` 5 5 1 1 2 3 4 ``` 输出: ``` 4 ``` 无多余空间的选法有以下 $4$ 种: - 选择物品 $1$、物品 $2$、物品 $4$:$1+1+3=5$ - 选择物品 $1$、物品 $5$:$1+4=5$ - 选择物品 $2$、物品 $5$:$1+4=5$ - 选择物品 $3$、物品 $4$:$2+3=5$ 注意,物品 $1$ 和物品 $2$ 虽然重量相同,但视为不同的物品。 ``` 8 21 10 4 2 30 22 20 8 14 ``` 输出: ``` 0 ``` 无论如何选择物品,都无法使大小之和恰好为 $21$。 ``` 20 100000000 35576749 38866484 6624951 39706038 11133516 25490903 14701702 17888322 14423251 32111678 24509097 43375049 35298298 21158709 30489274 37977301 19510726 28841291 10293962 12022699 ``` 输出: ``` 45 ``` ``` 16 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ``` 输出: ``` 12870 ```

输入格式

第 1 行:两个整数 $N$ 和 $X$,以空格分隔。 第 2 行到第 $N+1$ 行:每行一个整数 $w_i$,表示第 $i$ 个物品的大小。

输出格式

输出一个整数,表示选出若干个物品,使得它们的大小之和恰好等于 $X$ 的选法数。

说明/提示

- 物品的个数 $N$ 不超过 $32$,可以考虑使用“折半枚举”或“meet-in-the-middle”算法。 - 物品的大小和背包容量都可能很大,不能用常规的动态规划。 - 物品可以不选,也可以全部选,选法数包括所有可能的子集。 - 物品即使大小相同,也视为不同的物品。 由 ChatGPT 4.1 翻译