【A-选数】dfs方法

题意:

从n个数中选择K个数,和为S,求有多少种选法。
输入样例:
在这里插入图片描述
输出样例:
在这里插入图片描述

思路:

求有多少种方法,可以用dfs深入求解。

在dfs()中先要设置底线:
<1>当前组合的数的数目达到K且和为S,已达到要求。
<2>已经找过了n个数。
<3>当前组合的数的数目超过K或者和大于S。
设置递归:对于当前的数只有两种情况,选和不选,分别递归。

总结:

用dfs可以深入每一条路径,对于求有多少种方法等问题体现出了优越性。

用递归容易在不断的深入中陷入死循环,所以要求每一种情况的底线都要考虑到。

代码:

#include<iostream>
using namespace std;
int way;//已经有的方法数目
int n, k, s;
int* sto;
//sum 当前组合的和, num 当前组合中数的个数
void dfs(int i = 0, int sum = 0, int num = 0)
{
 if (sum == s && num == k)//符合要求噢
 {
  way++;
  return;
 }
 if (i >= n)//数组越界
  return;
 if (num > k || sum > s)//剪枝
  return;
 //剩余情况,还没达标但也没超标
 dfs(i + 1, sum + sto[i], num + 1);//选
 dfs(i + 1, sum, num);//不选
}
int main()
{
 int t;
 cin >> t;
 for (int i = 0; i < t; i++)
 {
  way = 0;
  cin >> n;
  cin >> k;
  cin >> s;
  sto = new int[n];
  for (int j = 0; j < n; j++)
   cin >> sto[j];
  dfs();
  cout << way << endl;
 }
}
发布了6 篇原创文章 · 获赞 4 · 访问量 173

猜你喜欢

转载自blog.csdn.net/qq_44047415/article/details/104702581