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