题目描述
从n个数中选择k个数和为sum,求有多少种情况
输入
输出
方法一:搜索树
- 对于每个数都有两种办法
- 第一种办法是选择:
cnt+1
、s+a[i]
- 第二种办法不选:
cnt
、s
- 结束递归的条件:当遍历完每一层回溯
#include <iostream>
using namespace std;
int a[40];
int n,k,sum,ans;
//i表示层数,cnt为个数,s为和
void dfs(int i,int cnt,int s){
if(i==n){
if(s==sum&&cnt==k){
ans++;
}
return;
}
dfs(i+1,cnt,s);
dfs(i+1,cnt+1,s+a[i]);
}
int main(){
cin>>n>>k>>sum;
for(int i=0;i<n;i++){
cin>>a[i];
}
ans=0;
dfs(0,0,0);
cout<<ans<<endl;
return 0;
}
方法二:一个数一个数选择
选了1之后就从2,3,4,5中选,保证每次选的数不重复,但是这个结果是12是因为有重复的数据比如:235、253类似的方法
#include <iostream>
using namespace std;
int a[40];
bool xuan[40];
int n,k,sum,ans;
void dfs(int s,int cnt){
if(s==sum&&cnt==k){
ans++;
}
for(int i=0;i<n;i++){
if(!xuan[i]){
xuan[i]=1;
dfs(s+a[i],cnt+1);
xuan[i]=0;
}
}
}
int main(){
cin>>n>>k>>sum;
for(int i=0;i<n;i++){
cin>>a[i];
}
ans=0;
dfs(0,0);
cout<<ans<<endl;
return 0;
}