zoj 1204 Additive equations
ACCEPT
acm作业
因为老师是在集合那里要我们做这道题。所以我很是天真的就以为要用集合做,结果发现网上都是用数组简单明了地实现了,显得我的代码,特么地超级恶心!!!!!!!
在这里存档一下,别人就不要看了,ZOJ的格式也真是恶心。。。居然因为这个也弄了好久,应该只有我一个人用这么 没脑的集合方式做吧。。真的是哭瞎在厕所里!!!
//#include "stdafx.h" #include"stdio.h" #include"iostream" #include<set> using namespace std; int tem[33] = { 0 };//存放加数 以便输出 int i = 0; int flag = 0; int c_sum=0; void dfs(set<int> &c_iset, set<int>::iterator c_iterator, int de, int num)//num为加数个数 { set<int>::iterator set_iter1; if (num == 2)//两个加数时 { for (set_iter1 = c_iterator, set_iter1++; *set_iter1 <*c_iset.rbegin(); set_iter1++)//set_iter1++,指向下一个、这里实现的是第二个加数 { //c_sum = 0; tem[de] = *set_iter1; c_sum += tem[de]; // for (int k = 0; tem[k] != 0; k++) // { // c_sum = c_sum + tem[k]; // } if (c_iset.find(c_sum) != c_iset.end())//找到sum 成功可输出 { flag = 1;//成功标志 printf("%d", tem[0]); for (int j = 1; tem[j] != 0; j++) { printf("+%d", tem[j]); } printf("=%d\n", c_sum); } if (c_sum >= *c_iset.rbegin())//结束,不必再继续递归下去 { tem[de] = 0;//重置为0 ,已经输出过了 return; } c_sum -= tem[de]; //dfs(c_iset, set_iter1, de + 1);//到下一个数 } } else { for (set_iter1 = c_iterator, set_iter1++; *set_iter1 <*c_iset.rbegin(); set_iter1++)//set_iter1++,指向下一个、这里实现的是第二个加数 { tem[de] = *set_iter1;//减少一个数 c_sum = 0; for (int k = 0; tem[k] != 0; k++) { c_sum = c_sum + tem[k]; } if (c_sum > *c_iset.rbegin())//超过最后一个没有必要再进行下去了 { tem[de] = 0; return; } num--; dfs(c_iset, set_iter1, de + 1, num); num++; } } tem[de] = 0;//重置为0 return; }; int main() { int n, m, l ; set<int>iset; set<int>::iterator set_iter;// scanf("%d", &n);//多少组 while (n-- > 0) { scanf("%d", &m);//每组个数 iset.clear();//清空 for (int j = 0; j < m; j++) { scanf("%d", &l); iset.insert(l); } flag = 0; for (int j = 2; j < m; j++)//加数个数从2到m-1个 { for (set_iter = iset.begin(); *set_iter <* iset.rbegin(); set_iter++)//固定的第一个加数 { c_sum = *set_iter; tem[0] = c_sum; i = 1; dfs(iset, set_iter, i,j); } } if (flag == 0) { printf("Can't find any equations.\n"); } printf("\n"); } return 0; }
下面的就不要看了,是第一次写错的结果每次accept都 是历经千辛万苦!!隔了要两个月了吧
========================================================================================================================================================================================================================================================================
WRONG ANSWER
set 作为参数要引用&!
注意还原,调试非常好用!
虽然做出来一点意思了,但是不符合要求。。。顺序这个,是要考我们按层次递归么?太蠢了!
但是第一次按自己的意思写出了想要的递归,我舍不得删掉,要留着
t等我写出答案,再来。。。
#include "stdafx.h" #include"stdio.h" #include"iostream" #include<set> using namespace std; int tem[33] = { 0 };//存放加数 以便输出 int i = 0; int flag = 0; void dfs(set<int> &c_iset, set<int>::iterator c_iterator, int de) { set<int>::iterator set_iter1; for (set_iter1 = c_iterator, set_iter1++; set_iter1 != c_iset.end(); set_iter1++)//set_iter1++,指向下一个 { int c_sum = 0; tem[de] = *set_iter1; for (int k = 0; tem[k] != 0; k++) { c_sum = c_sum + tem[k]; } if (c_iset.find(c_sum) != c_iset.end())//找到sum 成功可输出 { flag = 1;//成功标志 printf("%d", tem[0]); for (int j = 1; tem[j] != 0; j++) { printf("+%d", tem[j]); } printf("=%d\n", c_sum); } if (c_sum >= *c_iset.rbegin())//结束,不必再继续递归下去 { tem[de] = 0;//重置为0 return; } dfs(c_iset, set_iter1, de + 1); } tem[de] = 0;//重置为0 return; }; int main() { int n, m, l, sum; set<int>iset; set<int>::iterator set_iter;// scanf("%d", &n); while (n-->0) { scanf("%d", &m); iset.clear();//清空 while (m > 0) { scanf("%d", &l); iset.insert(l); m--; } flag = 0; for (set_iter = iset.begin(); set_iter != iset.end(); set_iter++) { sum = *set_iter; tem[0] = sum; i = 1; dfs(iset, set_iter, i); } if (flag==0) { cout << "Can't find any equations." << endl; } } return 0; }