/**
<挑战>::部分和问题
给定整数a1, a2, ……, an, 判断是否可以从中选出若干数, 使它们的和恰好为k;
限制条件:
1 <= n <= 20;
-10^8 <= ai, k <= 10^8;
*/
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
int n;
int a[28];
int ans(int i, int sum, int k)
{
if (sum == k && i == n)
{
//cout << "~~~~~~~~~~~~HHHHH~" << endl;
return 1;
}
if (i == n)
{
//cout << "Hello~~~~~~~~~~" << endl;
return 0;
}
if (ans(i+1, sum+a[i], k)) //notice: i+1可能可能超过n-1 宝宝自己领悟去吧 哟~丢出去~*~
{
cout << a[i] << " " << sum << " " ; //咦 关键点在数组哦 ~
cout << a[i] << " Yes " << endl;
return 1;
}
if (ans(i+1, sum, k))
{
cout << a[i] << " " << sum << " " ;
cout << a[i] << " Nap " << endl;
return 1;
}
//return 0;
}
/*
bool ans(int i, int sum, int k)
{
cout << a[i] << endl;
if (i == n)
{
return sum == k;
}
if (ans(i+1, sum, k))
{
cout << a[i] << " !!!! " << endl;
return true;
}
if (ans(i+1, sum+a[i], k))
{
cout << a[i] << endl;
return true;
}
return false;
}*/
int main()
{
int k;
int sum;
int ii;
bool result;
while (scanf("%d", &n))
{
ii = 0;
sum = 0;
memset(a, 0, sizeof(a));
for (int i=0; i<n; i++)
{
scanf("%d", &a[i]);
}
scanf("%d", &k);
result = ans(ii, sum, k);
if (result)
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
}
return 0;
}
重学搜索yi.1 :部分和--dfs
最新推荐文章于 2021-08-18 21:04:57 发布