标签:
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 }
标签:
原文地址:http://www.cnblogs.com/111qqz/p/4654628.html