U407992 子集和数

题目描述

已知 $n+1$ 个正数:$w_{i}(1\leq i \leq n)$ 和 $M$ ,要求找出$\{w_{i}\}$ 的所有子集使得子集中元素之和等于 $M$ 。解采用大小固定的n-元组$(x_{1},...,x_{n})$ 表达,其中:$x_{i}\in\{0,1\},1\leq i\leq n$ 。若$x_{i}=0$ ,表示解集合不包含 $w_{i}$ ;若 $x_{i}=1$,表示解集合包含 $w_{i}$。隐式约束条件是$\sum_{i=1}^nw_{i} x_{i} =M$。 要求利用回溯方法解决子集和数问题。

输入格式

第一行为一个正整数 $n$ ,表示总集规模; 第二行是正整数 $M$ ,表示子集的和数; 第三行是总集中 $n$ 个正整数,中间用空格隔开。

输出格式

如果有答案,则输出所有满足条件的子集(用固定长度n-元组表示符合条件的一个子集,即每行是一个长度为n的0/1序列),按字典序排列。 如果没有答案,则输出 `-1`

说明/提示

### 数据范围 $n\leq 20, \sum w_i,M\leq 10^9$ ### Bonus 想一想,若只要求判断是否有解,当 $n=40$ 时,有没有在**最坏情况下**仍能得到答案的算法?