zoj 1204 Additive equations
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                zoj 1204  Additive equations
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                ACCEPT
acm作業(yè) http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=204因為老師是在集合那里要我們做這道題。所以我很是天真的就以為要用集合做,結(jié)果發(fā)現(xiàn)網(wǎng)上都是用數(shù)組簡單明了地實現(xiàn)了,顯得我的代碼,特么地超級惡心!!!!!!! 在這里存檔一下,別人就不要看了,ZOJ的格式也真是惡心。。。居然因為這個也弄了好久,應(yīng)該只有我一個人用這么 沒腦的集合方式做吧。。真的是哭瞎在廁所里!!!
//#include "stdafx.h"
#include"stdio.h"
#include"iostream"
#include<set>
using namespace std;
int tem[33] = { 0 };//存放加數(shù) 以便輸出
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為加數(shù)個數(shù)
{set<int>::iterator set_iter1;if (num == 2)//兩個加數(shù)時{for (set_iter1 = c_iterator, set_iter1++; *set_iter1 <*c_iset.rbegin(); set_iter1++)//set_iter1++,指向下一個、這里實現(xiàn)的是第二個加數(shù){//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())//結(jié)束,不必再繼續(xù)遞歸下去{tem[de] = 0;//重置為0 ,已經(jīng)輸出過了return;}c_sum -= tem[de];//dfs(c_iset, set_iter1, de + 1);//到下一個數(shù)}}else{for (set_iter1 = c_iterator, set_iter1++; *set_iter1 <*c_iset.rbegin(); set_iter1++)//set_iter1++,指向下一個、這里實現(xiàn)的是第二個加數(shù){tem[de] = *set_iter1;//減少一個數(shù)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;//重置為0return;};int main(){int n, m, l ;set<int>iset;set<int>::iterator set_iter;//scanf("%d", &n);//多少組while (n-- > 0){scanf("%d", &m);//每組個數(shù)iset.clear();//清空for (int j = 0; j < m; j++){scanf("%d", &l);iset.insert(l);}flag = 0;for (int j = 2; j < m; j++)//加數(shù)個數(shù)從2到m-1個{for (set_iter = iset.begin(); *set_iter <* iset.rbegin(); set_iter++)//固定的第一個加數(shù){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;}
 下面的就不要看了,是第一次寫錯的結(jié)果每次accept都 是歷經(jīng)千辛萬苦!!隔了要兩個月了吧 ======================================================================================================================================================================================================================================================================== WRONG ANSWER
set 作為參數(shù)要引用&!
?
注意還原,調(diào)試非常好用!
雖然做出來一點意思了,但是不符合要求。。。順序這個,是要考我們按層次遞歸么?太蠢了!
但是第一次按自己的意思寫出了想要的遞歸,我舍不得刪掉,要留著
t等我寫出答案,再來。。。
?
#include "stdafx.h"
#include"stdio.h"
#include"iostream"
#include<set>
using namespace std;
int tem[33] = { 0 };//存放加數(shù) 以便輸出
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())//結(jié)束,不必再繼續(xù)遞歸下去{tem[de] = 0;//重置為0return;}dfs(c_iset, set_iter1, de + 1);}tem[de] = 0;//重置為0return;
};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;
}
 ?
?
轉(zhuǎn)載于:https://www.cnblogs.com/grandj/p/3762400.html
總結(jié)
以上是生活随笔為你收集整理的zoj 1204 Additive equations的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。