部分和问题 NYOJ1058 简单深搜
2014-09-22 20:59
120 查看
NYOJ 1058 部分和问题 【DFS】
时间限制:1000 ms
| 内存限制:65535 KB
难度:2
描述给定整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为K。
输入首先,n和k,n表示数的个数,k表示数的和。
接着一行n个数。
(1<=n<=20,保证不超int范围)
输出如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO”
样例输入
样例输出
这里简单的Dp 其实 最开始最想的是怎么记录这个数据是否已经被计算了。。。 于是采用一个visit 数组记录 就可以将数字记录下来
实现代码:
部分和问题
时间限制: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
这里简单的Dp 其实 最开始最想的是怎么记录这个数据是否已经被计算了。。。 于是采用一个visit 数组记录 就可以将数字记录下来
实现代码:
#include<iostream> #include<cstdio> using namespace std; const int max_n = 1000; int k , n; int num ; int a[max_n]; int visit[max_n]; bool dfs(int i , int sum) { if(i == n) return sum == k; //如果不加这个数和就到达了K那么返回true if(dfs(i + 1, sum)) { visit[i] = 0; return true ; } //如果加上这个数和也k 那么返回true if(dfs(i+1, sum + a[i])) { visit[i] = 1; return true ; } return false; } void solve() { if(dfs(0, 0)) { printf("Yes\n"); for( int j = 0 ;j <= n ; j++) { if(visit[j]) { printf("%d ", a[j]); } } } else printf("No\n") ; } int main() { while(scanf("%d %d", &n, &k)== 2) { num = 0; for(int i = 0 ; i < n ; i++) { scanf("%d", &a[i]); } solve(); } return 1; }
相关文章推荐
- nyoj1058部分和问题(简单基础易上手的dfs)
- NYOJ 1058 部分和问题(简单深搜)
- nyoj 1058 部分和问题 【简单DFS】
- NYOJ 1058部分和问题(dfs+回溯)
- NYOJ 1058 部分和问题
- NYOJ-1058(搜索)-题目----------------------------- 部分和问题
- nyoj 1058部分和问题(DFS)
- NYOJ 1058 部分和问题(dfs)
- NYOJ-1058 部分和问题
- nyoj1058部分和问题
- NYOJ 1058--部分和问题【DFS】
- NYOJ-1058 部分和问题
- NYOJ 1058 部分和问题
- NYOJ 1058 部分和问题 (深搜DFS)
- nyoj1058 部分和问题
- nyoj 1058 部分和问题 【DFS】
- nyoj1058部分和问题(基于01背包的思想)
- nyoj 1058 部分和问题
- NYOJ 1058 部分和问题【DFS】
- nyoj1058 部分和问题