标签:个数 sum amp names const int 剪枝 void include
从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; }
标签:个数 sum amp names const int 剪枝 void include
原文地址:https://www.cnblogs.com/xusi/p/12336266.html