The partial sum problem(DFS+减枝)

原创 2018年04月16日 19:44:36
描述 One day,Tom’s girlfriend give him an array A which contains N integers and asked him:Can you choose some integers from the N integers and the sum of them is equal to K. 

输入

There are multiple test cases.
Each test case contains three lines.The first line is an integer N(1≤N≤20),represents the array contains N integers. The second line contains N integers,the ith integer represents A[i](-10^8≤A[i]≤10^8).The third line contains an integer K(-10^8≤K≤10^8).

输出

If Tom can choose some integers from the array and their them is K,printf ”Of course,I can!”; other printf ”Sorry,I can’t!”.

样例输入

4 1 2 4 7 13 4 1 2 4 7 15

样例输出

Of course,I can! Sorry,I can't!


题目大意:多组数据测试,每组给一个N和N个数字,一个K。判断是否有给出的数字相加等于K,若有则输出Of course,I can!,若无则输出Sorry,I can't! ,时间限制:1000ms。

思路:读完题思路还是很清晰的,可以用递归解决但会超时,在纠结了很久后选择放弃了递归使用DFS,直接DFS与递归没有什么区别,还是超时,所以需要进行减枝(实在是我的弱项啊)。
#include<iostream>
#include<stdio.h>
using namespace std;
int n,s,a[21],flag,i,j;
void dfs(int i, int sum)//传入位置与当前和s
{
      if(i==n+1) 
      {
	     return ;
      }
      if(sum>s) 
      {
	     return ;//减枝
      }
      if(sum==s) 
      {
          flag=1;
          return ;
      }
      dfs(i+1,sum);
      dfs(i+1,sum+a[i]);//对于第i+1个数取与不取
} 
int main() 
{
    while (scanf("%d",&n)!=EOF) 
    {
       flag=0;
       for(i=0;i<n;i++)
       {
	      scanf("%d",&a[i]);
	   }
       scanf("%d",&s);
       dfs(0,0);
       if(flag!=0) 
	   {
          printf("Of course,I can!\n");
           }
	   else
	   {
          printf("Sorry,I can't!\n");
       }
    }
    return 0;
}//感觉DFS减枝与我之前写的递归没什么区别,但就是要超时,作为一个小白我暂时也很迷


图---DFS剪枝

DFS剪枝即对DFS进行适当优化,满足条件则退出递归,不需要遍历完所有情况。 例如下面出自POJ的题目: TCGG GCAG CCGC GATC ATCG 这五个串是一个原串的子串,求最小原串的长度?...
  • henry860916
  • henry860916
  • 2015-12-27 16:24:44
  • 341

DFS初级剪枝及心得

关于DFS心得: 1、利用结构体,记录mark和题目要求的基本属性。 2、用到递归,使用递归时注意要设置出口,即符合要求时return,注意对递归的理解,对于不同情况可能要传递不同的参数,但出口都...
  • yopilipala
  • yopilipala
  • 2017-01-14 11:21:22
  • 439

The partial sum problem

 http://acm.nyist.net/JudgeOnline/problem.php?pid=927 #include #include int vis[30],a[30],n,k,...
  • shuangyueliao
  • shuangyueliao
  • 2015-03-08 19:30:09
  • 237

NYOJ--927--搜索--The partial sum problem

/* Name: NYOJ--927--The partial sum problem Author: shen_渊 Date: 15/04/17 19:41 Description: DF...
  • xiaomuzhi356
  • xiaomuzhi356
  • 2017-04-15 19:44:12
  • 107

NYOJ-927 The partial sum problem

The partial sum problem 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述One day,Tom’s girlfriend ...
  • Justesss
  • Justesss
  • 2014-07-22 14:47:32
  • 602

NYOJ 927 The partial sum problem 【DFS】+【剪枝】

The partial sum problem 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述One day,Tom’s girlfriend ...
  • u012846486
  • u012846486
  • 2014-06-18 17:12:09
  • 1039

南阳理工 927 The partial sum problem

The partial sum problem 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述One day,Tom’s girlfriend ...
  • linyuxilu
  • linyuxilu
  • 2015-07-24 12:26:51
  • 364

DFS + 剪枝策略

一:简介 (1)相信做过ACM的人,都很熟悉图和树的深度优先搜索;算法里面有蛮力法 —— 就是暴力搜索(不加任何剪枝的搜索); (2)蛮力搜搜需要优化时,就是需要不停的剪枝,提前减少不必要的搜索路径,...
  • u010700335
  • u010700335
  • 2015-03-06 09:29:49
  • 4427

hdu 4474 dfs+减枝

There are tons of problems about integer multiples. Despite the fact that the topic is not original,...
  • tianyuhang123
  • tianyuhang123
  • 2017-09-16 10:53:09
  • 85

NYOJ 927 The partial sum problem (DFS)

题目927 题目信息 运行结果 本题排行 讨论区 The partial sum problem 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述One...
  • a2459956664
  • a2459956664
  • 2016-06-17 17:02:55
  • 216
收藏助手
不良信息举报
您举报文章:The partial sum problem(DFS+减枝)
举报原因:
原因补充:

(最多只允许输入30个字)