查了好多資料,發現還是不全,干脆自己整理吧,至少保證在我的做法正確的,以免誤導讀者,也是給自己做個記載吧!
????題目的意思是比較明顯的,就是當初給你m根木棒,當初讓你判斷利用這些木棒能不能組成一個正方形。其實也就是看是不是用一些木棒能湊成4條相稱的邊。of course深搜。自己做的時候各種超時,各種不解關鍵在于排好序的時候,在組成一條邊的時候要么選要么就直接不選了,這一點很主要。詳細的分析看下面的程序。
嶺上嬌艷的鮮花,怎敵她美麗的容顏?山間清澈的小溪,怎比她純潔的心靈?
#include<iostream>
#include<algorithm>
using namespace std;
int stick[25],visited[25];
int m,traget;
bool cmp(int a,int b)
{return a<b;
}
//dfs中的變量的含意,current在湊這條邊的時候當前長度,time記載到當初湊夠幾條邊了,搜索的范圍是k——1.
bool dfs(int current,int time,int k)
{if(time==3)return true;for(int i=k;i>=1;i--){if(visited[i]==0){visited[i]=1;if(current+stick[i]==traget){//返回true是必須的,返回true說明這條邊是可取的,反之就是這時不加這條邊if(dfs(0,time+1,m))return true;}else {if(current+stick[i]<traget)if(dfs(current+stick[i],time,i-1))//這里的i-1是重點,搜索的范圍要減一。return true;}//回溯一下。visited[i]=0;}}return false;
}
int main()
{int n,sum,i;cin>>n;while(n--){sum=0;cin>>m;for(i=1;i<=m;i++){cin>>stick[i];sum+=stick[i];}memset(visited,0,sizeof(visited));sort(stick+1,stick+1+m,cmp);//木棒長度之和不能被4整除則直接輸出noif((sum%4)!=0)cout<<"no"<<endl;else {//每條邊的目標長度traget=sum/4;//深搜返回true當然輸出yesif(dfs(0,0,m))cout<<"yes"<<endl;else cout<<"no"<<endl;}}return 0;
}
????
?
文章結束給大家分享下程序員的一些笑話語錄: IT業眾生相
第一級:神人,天資過人而又是技術狂熱者同時還擁有過人的商業頭腦,高瞻遠矚,技術過人,大器也。如丁磊,求伯君。
第二級:高人,有天賦,技術過人但沒有過人的商業頭腦,通常此類人不是頂尖黑客就是技術總監之流。
第三級:牛人,技術精湛,熟悉行業知識,敢于創新,有自己的公司和軟件產品。
第四級:工頭,技術精湛,有領導團隊的能力,此類人大公司項目經理居多。
第五級:技術工人,技術精湛,熟悉行業知識但領導能力欠加,此類人大多為系分人員或資深程序員,基本上桀驁不遜,自視清高,不愿于一般技術人員為伍,在論壇上基本以高手面目出現。
第六級:熟練工人,技術有廣度無深度,喜歡鉆研但淺嘗輒止。此類人大多為老程序員,其中一部分喜歡利用工具去查找網上有漏洞的服務器,干點壞事以獲取成績感。如果心情好,在論壇上他們會回答菜鳥的大部分問題。此級別為軟件業苦力的重要組成部分。
第七級:工人,某些技術較熟練但缺乏深度和廣度,此類人大多為程序員級別,經常在論壇上提問偶爾也回答菜鳥的問題。為軟件產業苦力的主要組成部分。
第八級:菜鳥,入門時間不長,在論壇上會反復提問很初級的問題,有一種唐僧的精神。雖然招人煩但基本很可愛。只要認真鉆研,一兩年后就能升級到上一層。
第九級:大忽悠,利用中國教育的弊病,頂著一頂高學歷的帽子,在小公司里混個軟件部經理,設計不行,代碼不行,只會胡亂支配下屬,拍領導馬屁,在領導面前胡吹海侃,把自己打扮成技術高手的模樣。把勾心斗角的辦公室文化引入技術部門,實在齷齪!
第十級:驢或傻X,會寫SELECT語句就說自己精通ORALCE,連寄存器有幾種都不知道就說自己懂匯編,建議全部送到日本當IT產業工人,掙了日本人的錢還嚴重打擊日本的軟件業!
--------------------------------- 原創文章 By
返回和長度
---------------------------------