码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 1564 Sum It Up (DFS+剪枝)

时间:2015-07-17 15:51:55      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:

http://poj.org/problem?id=1564

dfs

三个参数 x,sum,k,   x表示开始的坐标,sum表示当前的和,k表示这是一组答案中的第几个数,是用来记录路径的...

调了好久没写出来...我写完之后答案会有重复.一开始想开一个boolean数组记录,这样第一组样例的3+1就只会输出一遍,但是这样,2+2就不会被记录到答案中了.

然后看了下别人的代码...

卧槽,只是加了个判断...当前的数和上一个如果不同,就继续dfs....

我为何就没想到...这特么是判断重复的直译啊....

 1 /*************************************************************************
 2     > File Name: code/2015summer/0714/K.cpp
 3     > Author: 111qqz
 4     > Email: rkz2013@126.com 
 5     > Created Time: 2015年07月16日 星期四 01时03分01秒
 6  ************************************************************************/
 7 
 8 #include<iostream>
 9 #include<iomanip>
10 #include<cstdio>
11 #include<algorithm>
12 #include<cmath>
13 #include<cstring>
14 #include<string>
15 #include<map>
16 #include<set>
17 #include<queue>
18 #include<vector>
19 #include<stack>
20 using namespace std;
21 #define REP(i, n) for (int i=0;i<int(n);++i)  
22 typedef long long LL;
23 typedef unsigned long long ULL;
24 const int N=20;
25 int n,t;
26 int a[N];
27 int ans;
28 int k;
29 int rec[N];
30 bool vis[105];
31 bool ok;
32 void dfs(int x,int sum,int k)
33 {
34     if (sum==t)
35     {
36       ok=true;
37       for ( int i = 0 ; i < k ; i++)
38       {
39         if (i)
40         {
41             printf("+%d",rec[i]);
42         }
43         else
44         {
45             printf("%d",rec[i]);
46         }
47       }
48       printf("\n");
49       return;
50     }
51     int pre = -1;
52     for ( int i = x ; i < n ; i++)
53     {
54       if (sum+a[i]<=t&&a[i]!=pre)
55       {
56         pre = a[i];
57         rec[k] = a[i];
58         dfs(i+1,sum+a[i],k+1);
59       }
60     }
61 }
62 int main()
63 {
64     while (scanf("%d %d",&t,&n)!=EOF&&n)
65     {
66        ok = false;
67       memset(vis,false,sizeof(vis));
68       ans  = 0 ;
69       k = 0;
70       for ( int i = 0 ; i < n ; i++)
71         scanf("%d",&a[i]);
72       printf("Sums of %d:\n",t);
73       dfs(0,0,0);
74       if (!ok) printf("NONE\n");
75     }
76   
77     return 0;
78 }

 

POJ 1564 Sum It Up (DFS+剪枝)

标签:

原文地址:http://www.cnblogs.com/111qqz/p/4654628.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!