题目
题目大意
本题为dfs深度优先搜索解题的题目。题目给出一串n个数字,要求从其中选取k个数字,使得k个数字的和为s。n,k,s均已给出。题目要求得出可以选择的情况钟数。
解题思路
本题采用的dfs思想,主要要通过递归函数的方式来实现。每次递归的过程中记录当前已选定数字数目、当前选定数字和继续选定数字开始的下标。当选定数字数目等于k,选定数字和等于s时,说明满足题目要求,可以给ans加一且结束当前递归。dfs运行结束后得到的ans就是最终答案。
具体代码
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include<cstdlib>
#include<ctime>
#include<iomanip>
#define ll long long
#define FOR(i,a,n) for(register int i=a;i<n;i++)
#define RF(i,a,n) for(register int i=a;i>n;i--)
#define NIL -1
using namespace std;
int num[105],ans;
void dfs(int t, int sum, int d, int s, int k, int n)
{
if(t==k)
{
if(sum == s)
{
ans++;
}
}
else
{
for(int i = d; i < n; i++)
{
dfs(t+1,sum+num[i],i+1,s,k,n);
}
}
return;
}
int main()
{
int t,n,k,s;
cin >> t;
while(t--)
{
ans = 0;
cin >> n >> k >> s;
for(int i = 0; i < n; i++)
{
cin >> num[i];
}
dfs(0,0,0,s,k,n);
cout << ans << endl;
}
return 0;
} ```