求解部分和问题
题目内容:
给出N个正整数组成的数组A,求能否从中选出若干个,使他们的和为K。如果可以,输出:“YES”,否则输出"NO"。
输入格式:
第1行:2个数N、K, N为数组的长度, K为需要判断的和(2 ≤N ≤ 20,1 ≤ K ≤ 10^9)
第2 到第 N + 1行:每行1个数,对应数组的元素A[i] (1 ≤ A[i]≤ 10^6)
输出格式:
如果可以,输出:“YES”,否则输出"NO"。
样例输入
4 13
1
2
4
7
样例输出
YES
输入样例:
5 9
1
2
3
4
5
输出样例:
YES
时间限制:500ms内存限制:32000kb
/*C++代码*/
#include <iostream>
#include <string>
using namespace std;
int Isexit(int a[], int n, int i)
{
for (int j = 0; j < n; j++)
{
if (a[j] == i)
return 1;
}
return 0;
}
int main()
{
int n, k, a[20], m = 0, b[20], i = 0, j = 0, count[20] = { 0 }, t = 0, each[20];
cin >> n >> k;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
while (i < n)
{
if (i == -1)
break;
each[i] = j;
if (each[i] == n)
{
i--;
j = each[i];
j++;
continue;
}
b[i] = j;
count[i + 1] = count[i] + a[j];
if (Isexit(b, i, j) == 0)
{
if (count[i + 1] == k)
{
t = 1;
break;
}
else
{
if (i != n - 1)
{
i++;
j = 0;
}
else
j++;
}
}
else
j++;
}
if (t == 1)
cout << "YES" << endl;
else
cout << "NO" << endl;
getchar();
}