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; 
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM