nyoj 1058 部分和问题 【DFS】
2014-06-16 21:58
204 查看
这道题同上一道题一起比较一下 大概就可以理解DFS中‘return;’的作用了;
时间限制:1000 ms | 内存限制:65535 KB
难度:2
描述给定整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为K。
输入首先,n和k,n表示数的个数,k表示数的和。
接着一行n个数。
(1<=n<=20,保证不超int范围)
输出如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO”
样例输入
样例输出
部分和问题
时间限制: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
#include<stdio.h> int a[22], ans[22], flag, n, k; void sear( int sum, int cou ) //sum是和 { int i, j; if( sum == k ) { if( !flag ) { flag = 1; printf( "YES\n" ); } for( i = 0; i < n; i ++ ) if( ans[i] ) printf( "%d ", a[i] ); printf( "\n" ); return; } for( i = cou; i < n; i ++ ) { sum +=a[i]; ans[i] = 1; //假设sum+a[i]<k; sear( sum, i+1 ); ans[i] = 0; sum-=a[i]; } } int main() { int i; while( ~scanf( "%d%d", &n, &k ) ){ for( i = 0; i < n; i ++ ) scanf( "%d", &a[i] ), ans[i] = 0; flag = 0; sear( 0, 0 ); if( flag == 0 ) printf( "NO\n" ); } }
相关文章推荐
- NYOJ 1058 部分和问题【DFS】
- NYOJ 1058 部分和问题 【DFS】
- NYOJ 1058 部分和问题(dfs)
- 【经典DFS】NYOJ-1058-部分和问题
- NYOJ 1058 部分和问题(经典题目dfs)
- nyoj--1058--部分和问题(dfs)
- NYOJ 1058 部分和问题 (深搜DFS)
- NYOJ 1058部分和问题(dfs+回溯)
- NYOJ--1058--dfs--部分和问题
- NYOJ-1058- 部分和问题(DFS)
- nyoj1058 部分和问题 dfs
- NYOJ 1058 部分和问题 (DFS)
- nyoj 1058部分和问题(DFS)
- NYOJ - 1058 - 部分和问题(DFS+减枝)
- nyoj--1058 部分和问题(dfs)
- nyoj1058部分和问题(简单基础易上手的dfs)
- NYOJ1058. 部分和问题(基础DFS)
- NYOJ 1058 部分和问题 【DFS】
- NYOJ 1058--部分和问题【DFS】
- NYOJ 1058 部分和问题 (DFS)