n个数中选k个数和为sum

Posted Maxwell·

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; 
}

 

以上是关于n个数中选k个数和为sum的主要内容,如果未能解决你的问题,请参考以下文章

编程之法:面试和算法心得(寻找和为定值的多个数)

递归实现从n个数中选r个数的组合数

和为定值的多个数

JAVA从数组中选取N个数,使其和为M实现算法?

组合(1-m中选n个数)

Codeforces Round #646 (Div. 2) A. Odd Selection(数学)