#include<bits/stdc++.h>
using namespace std;
//深搜树模型
/*n个数 从中选k个数 使k个数之和为s
若存在输出YES,否则输出NO
input:
n:3 k:2 s:6
arr:1 2 5
output:
YES
*/
int n, k, s;
int a[101];
bool flag = false;
void dfs(int m, int sum, int dep)
{
if (m == k && sum == s)
{
flag = true;
return;
}
if (sum >= s) return;
if (dep == n) return;
dfs(m + 1, sum + a[dep], dep + 1); //选
if (flag) return;//最优性剪枝
dfs(m, sum, dep + 1); //不选
}
int main()
{
cin >> n >> k >> s;
for (int i = 0; i < n; i++)
cin >> a[i];
dfs(0, 0, 0); //初始状态
cout << (flag ? "YES" : "NO");
return 0;
}
深搜树模型
于 2023-02-25 10:22:51 首次发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)