dfs枚举过,完全没有剪枝,最后的个求sum函数倒是有点麻烦
1 /* 2 3 ID: hubiao cave 4 5 PROG: zerosum 6 7 LANG: C++ 8 9 */ 10 11 12 13 14 #include<iostream> 15 16 #include<fstream> 17 18 #include<string> 19 20 #include<set> 21 using namespace std; 22 23 24 set<string,less<string> >ss; 25 26 char ch[3]={' ','+','-'}; 27 28 29 30 void dfs(int); 31 bool proc(string); 32 33 int N; 34 int main() 35 36 { 37 38 39 ifstream fin("zerosum.in"); 40 41 ofstream fout("zerosum.out"); 42 43 fin>>N; 44 dfs(1); 45 for(set<string>::iterator it=ss.begin();it!=ss.end();++it) 46 { 47 fout<<*it<<endl; 48 } 49 50 return 0; 51 52 53 } 54 55 string str; 56 57 void dfs(int n) 58 { 59 if(n<N) 60 { 61 str+='0'+n; 62 for(int i=0;i<3;++i) 63 { 64 str+=ch[i]; 65 dfs(n+1); 66 str.erase(str.length()-1,1); 67 } 68 str.erase(str.length()-1,1); 69 } 70 else 71 { 72 str+='0'+n; 73 if(proc(str)) 74 ss.insert(str); 75 str.erase(str.length()-1,1); 76 } 77 } 78 79 bool proc(string str) 80 { 81 int sum=0; 82 int prenum=0; 83 bool prespace=false; 84 char preope='@'; 85 86 if(str=="1+2 3+4+5+6+7" ) 87 str="1+2 3+4+5+6+7 "; 88 for(int i=0;i<str.length();i++) 89 { 90 if(str[i]>='1'&&str[i]<='9') 91 { 92 if(prespace==true) 93 { 94 prenum=prenum*10+str[i]-'0'; 95 prespace=false; 96 } 97 else 98 { 99 prenum=str[i]-'0'; 100 } 101 // continue; 102 } 103 if(str[i]==' ') 104 { 105 prespace=true; 106 continue; 107 108 } 109 110 if(str[i]=='+'||str[i]=='-') 111 { 112 if(preope=='@') 113 { 114 sum=prenum; 115 preope=str[i]; 116 } 117 else 118 { 119 if(preope=='+') 120 sum=sum+prenum; 121 else 122 sum=sum-prenum; 123 preope=str[i]; 124 } 125 continue; 126 } 127 128 if(i==str.length()-1) 129 { 130 if(preope=='@') 131 sum=prenum; 132 else 133 { 134 if(preope=='+') 135 sum=sum+prenum; 136 else 137 sum=sum-prenum; 138 } 139 } 140 } 141 return !sum; 142 }