0
点赞
收藏
分享

微信扫一扫

【抽象DFS专项训练】K个数的和

杰森wang 2022-03-11 阅读 32

题目描述

从n个数中选择k个数和为sum,求有多少种情况

输入

输出


方法一:搜索树

  1. 对于每个数都有两种办法
  2. 第一种办法是选择:cnt+1s+a[i]
  3. 第二种办法不选:cnts
  4. 结束递归的条件:当遍历完每一层回溯
#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;
}
举报

相关推荐

0 条评论