![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cmath> 5 #include <cstring> 6 7 using namespace std; 8 int n,k,c,sum,s[201],vis[201],ok; //sum和,s【】表示输入数据,vis【】表示是否用过。 9 10 void dfs(int c1,int sum1) 11 { 12 if(sum1==k) 13 { 14 ok=0; 15 printf("YES "); 16 for(int j=0;j<c1;j++) 17 if(vis[j]) 18 printf("%d ",s[j]); 19 printf(" "); 20 21 } 22 for(int i=c1;i<n;i++) 23 { 24 sum1+=s[i]; 25 vis[i]=1; 26 dfs(i+1,sum1); 27 vis[i]=0; 28 sum1-=s[i]; 29 } 30 31 } 32 33 34 int main() 35 { 36 while(~scanf("%d%d",&n,&k)) 37 { 38 c=0; 39 ok=1; 40 for(int i=0;i<n;i++) 41 scanf("%d",&s[i]); 42 memset(vis,0,sizeof(vis)); 43 sum=0; 44 dfs(c,sum); 45 if(ok) 46 printf("NO "); 47 } 48 return 0; 49 }
从a1开始按顺序决定每个数加或者不加,在全部n个数都决定后判断是否和等于给定的值k即可。