题意:从n个数中选出k个和为sum,输出所有方案
思路:因为每个数都是可能选择的,所以为了求得可行解,可以尝试性搜索,运用dfs思想进行递归深搜(每个元素都有选与不选两种选择)每次尝试选取K个元素,和=sum,则输出。
总结:该题利用dfs,dfs主要针对存在很多可能情况下,先选择某一种情况,向前探索,符合条件则继续,不符合则回溯。关键的是dfs与枚举的区别在于dfs可以优化剪枝,在每次进行探索式,判断符合的条件,不符合则回溯。
代码:
#include<iostream>
#include<vector>
using namespace std;
vector<int>p,q;
int k,n;int count;
void selectnum(vector<int> p,int i,int sum)
{
if(p.size()>k||sum<0) return;
if(p.size()==k&&sum==0)
{ count++;
return;
}
if(i>=n) return;
selectnum(p,i+1,sum);//不选
p.push_back(q[i]);
selectnum(p,i+1,sum-q[i]);//选
p.pop_back();
}
int main()
{
int t;cin>>t;
while(t--)
{ count=0;
int sum;cin>>n>>k>>sum;
p.clear();q.clear();
for(int i=0;i<n;i++)
{
int x;cin>>x;q.push_back(x);
}
selectnum(p,0,sum);cout<<count<<endl;
} return 0;
}