题目描述:
给定n个数,从中选择K个,使得这K个数的和为S,问有几种选择方案。共有T组数据。
思路:
这道题是一道深度优先搜索题,从第一个数开始,每次判断当前的数是选择还是不选。在判断的过程中,进行可行性剪枝:
1.若选择后,选择数的个数已经超过了K,则放弃选择,直接返回。
2.若选择后,选择数的和已经超过了S,则放弃选择,直接返回。
搜索的终点:选择数的个数恰好为K且和恰好为S是,则ans+1.
代码:
#include<iostream>
using namespace std;
int n,k,s,ans;
int a[110];
void dfs(int n_now,int k_now,int s_now)
{
if(k_now>k||s_now>s) return;
if(k_now==k&&s_now==s)
{
ans++;
return ;
}
if(n_now+1<=n&&k_now+1<=k&&s_now+a[n_now+1]<=s)
dfs(n_now+1,k_now+1,s_now+a[n_now+1]);
if(n_now+1<=n) dfs(n_now+1,k_now,s_now);
}
int main()
{
int T;
cin>>T;
while(T--)
{
ans=0;
cin>>n>>k>>s;
for(int i=1;i<=n;i++)
cin>>a[i];
dfs(0,0,0);
cout<<ans<<endl;
}
}