4 13 1 2 4 7
YES 2 4 7
典型的深度优先搜索问题,注意特殊情况的输出
例如:
4 7
1 2 4 7
输出的是1 2 4或者7都行,甚至两个都输出也可以,,这。。。。大概要问NYOJ判题系统了
我自己深搜代码如下:
#include<stdio.h> const int MAXN=200; int a[MAXN],n,k,b[MAXN]= {0},l; bool dfs(int i,int sum) { if(i==n) return sum==k; if(dfs(i+1,sum)) return true; if(dfs(i+1,sum+a[i])) { b[l++]=a[i]; return true; } return false; } int main() { int i; while(scanf("%d%d",&n,&k)==2) { l=0; for(i=0; i<n; i++) scanf("%d",&a[i]); if(dfs(0,0)) { printf("YES\n"); for(i=l-1; i>=0; i--) printf("%d ",b[i]); printf("\n"); } else printf("NO\n"); } }还有更简单的如下:
#include<stdio.h> int f = 1,n,k,w[21]={0},s[21]={0}; bool a[21]={0}; void DFS(int i, int c) { int j; if(i>=0) { if(c+s[i]<k)return; if(c+w[i]<=k) { a[i]=1; DFS(i-1,c+w[i]); a[i]=0; } DFS(i-1,c); if(c==k&&f) { f=0; printf("YES\n"); for(j=1;j<=n;j++) if(a[j]) printf("%d ",w[j]); printf("\n"); } } } int main() { while(~scanf("%d%d",&n,&k)) { int i;f=1; for(i=1;i<=n;i++) { s[i]=0; scanf("%d",&w[i]); s[i]=s[i-1]+w[i]; } DFS(n,0); if(f)printf("NO\n"); } }可以输出多种情况的
#include <stdio.h> int n, k, ok, arr[22], vis[22], count; void DFS(int pos){ if(count == k) { ok = 1; printf("YES\n"); for(int i = 0; i < n; ++i) if(vis[i]) printf("%d ", arr[i]); printf("\n"); } for(int i = pos; i < n; ++i) { count += arr[i]; vis[i] = 1; DFS(i + 1); count -= arr[i]; vis[i] = 0; } } int main(){ while(scanf("%d%d", &n, &k) == 2){ ok = 0; for(int i = 0; i < n; ++i){ scanf("%d", arr + i); vis[i] = 0; } count = 0; DFS(0); if(!ok) printf("NO\n"); } return 0; }