题意:从n个数中选取任意个数的数,看是否等于k。
代码给出了十分清晰简洁的优雅递归写法。
#include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> #include <cstring> #include <map> #include <queue> #include <vector> #include <set> #include <stack> using namespace std; typedef long long int LL; const int M=100009,INF=0x3fffffff; int n,str[M],k; bool dfs(int i,int sum){ if(i == n) return sum == k;//搜索到头,递归终止条件,判断是否满足条件 if(dfs(i+1,sum)) return true;//不选当前数 if(dfs(i+1,sum+str[i])) return true;//选当前数 return false;//无论选不选都不行则返回false } int main(void){ while(~scanf("%d%d",&n,&k)) { for(int i = 0; i < n; i++) { scanf("%d",&str[i]); } if(dfs(0,0)) printf("YES!~\n"); else printf("NO!~\n"); } return 0; }
原文:http://blog.csdn.net/jibancanyang/article/details/44966591