选数问题dfs模版

题目

在这里插入图片描述

题目大意

本题为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;
} ```

原创文章 46 获赞 1 访问量 1524

猜你喜欢

转载自blog.csdn.net/weixin_43676449/article/details/104680907