NYOJ 1058 部分和问题
2014-07-22 17:34
176 查看
部分和问题
时间限制:1000 ms | 内存限制:65535 KB难度:2
描述给定整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为K。
输入首先,n和k,n表示数的个数,k表示数的和。
接着一行n个数。
(1<=n<=20,保证不超int范围)
输出如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO”
样例输入
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; }
相关文章推荐
- nyoj 1058 部分和问题 【DFS】
- NYOJ-1058 部分和问题
- nyoj 1058 部分和问题
- NYOJ 1058--部分和问题【DFS】
- NYOJ 1058 部分和问题(经典题目dfs)
- NYOJ 1058 部分和问题 【DFS】
- NYOJ 1058部分和问题(dfs+回溯)
- nyoj1058部分和问题(简单基础易上手的dfs)
- NYOJ-1058 部分和问题
- 【经典DFS】NYOJ-1058-部分和问题
- NYOJ 1058 部分和问题(dfs)
- nyoj1058 部分和问题
- NYOJ 1058 部分和问题
- 搜索学习(3)--NYOJ1058--部分和问题
- nyoj 1058 部分和问题
- NYOJ 1058 部分和问题
- 部分和问题 NYOJ1058 简单深搜
- nyoj--1058 部分和问题(dfs)
- NYOJ-1058(搜索)-题目----------------------------- 部分和问题
- nyoj 1058 部分和问题 【简单DFS】