描述 | |
给定整数集合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 |
#include<iostream>
using namespace std;
int s[20] = { 0 }, T, N;
bool found = 0;
void f(int i, int x)//i为集合中的第i个元素,x为当前的乘积
{
if (i > N||found) {//如果找到了 或者 所有元素均以尝试,return
return;
}
if (x == T) {//如果当前乘积=目标数
cout << "YES" << endl;
found = 1;
return;
}
f(i + 1, x);//如果不取第i个元素,继续对第i+1个元素的讨论
f(i + 1, x * s[i]);//如果取第i个元素
}
int main()
{
while (cin >> T >> N) {
found = 0;
for (int i = 0; i < N; ++i) {
cin >> s[i];
}
f(1, 1);
if (found == 0) {
cout << "NO" << endl;
}
}
return 0;
}