n个数中选k个数和为sum

从n个数中选k个数,使和为sum

输入

第一行 n k sum

第二行 n个数

输出

可以选的种数

输入样例:

5 3 9

1 2 3 4 5

30 8 200

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

输出样例:

2

70

#include <stdio.h>
#include <iostream>
#include <math.h>
#include <string.h>
using namespace std;
const double PI=acos(-1.0);
int n,k,sum;
int ans;
int a[105];
bool vis[105];
void dfs(int pos,int cnt,int s){
    if(cnt>k||s>sum){//剪枝 
        return;
    }
    if(cnt==k&&s==sum){//满足选了k个数和为sum 则结果+1 
        ans++;
    }
    for(int i=pos;i<n;i++){//该循环表示便利数组找满足条件的解 超过条件的直接剪枝 
                           //从pos开始表示选过的不会重复选择  每次循环的下一个项是未搜索过的项 
        if(!vis[i]){
            vis[i]=true;
            dfs(i+1,cnt+1,s+a[i]);
            vis[i]=false;
        }
    }
}
int main(){
    cin>>n>>k>>sum;
    for(int i=0;i<n;i++){
        cin>>a[i];
        //a[i]=i+1;
    }
    dfs(0,0,0);
    cout<<ans;
    return 0; 
}
原文地址:https://www.cnblogs.com/xusi/p/12336266.html