题意:
从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;
}
}