08 集合里的乘法
描述
给定整数集合S和一个目标数T,判断是否可以从S中挑选一个非空子集,子集中的数相乘的乘积为T。
关于输入
输入为两行。
第一行为目标数T和S中的元素个数N,以空格隔开。
第二行为S中的N个元素,以空格隔开。
其中 N <= 16。
关于输出
如果可以,则输出YES,否则输出NO。
例子输入
Sample Input 1:
12 5
1 2 3 4 5
Sample Input 2:
33 5
4 2 8 7 5
例子输出
Sample Output 1:
YES
Sample Output 2:
NO
分析
这个题事实上是背包问题的一个变体,也可以做有关动态规划的优化。但是这里我们只用递归的形式来解决。
类似背包问题的解法,我们用一个函数的参数来表征当前的结果,另一个函数的参数表示当前正在对第几个物品进行判断。事实上,这就是用递归的形式来完成一个N层循环,遍历所有可能的情况来得到解。
代码实现
#include