菜鳥學演算法之POJ 1564 Sum It Up

2021-07-06 04:32:19 字數 999 閱讀 3843

題目大意:給定 n 個數字和乙個正整數t ,要求在這n個數字中找出若干個數,使它們的和等於t ,然後輸出所有這樣的組合,注意輸出的時候,嚴格地按照降序輸出,即:每一行的所有數字降序輸出,不同的行,先比較第乙個數字,按降序輸出;如果第乙個數字相同,再按第二個數字降序輸出,依次類推.

看完這道題,第一感覺就是"好像很難的樣子,怎麼做???",冷靜下來後,開始思考自己做過的題目,覺得應該使用dfs,於是繼續思考,按照dfs題目的標準步驟一步一步地思考,最終成功ac掉!

**如下:

/** 既然已經確定採用dfs,那麼:

* 第一步,設計dfs的引數有哪些: int len:當前已獲得的陣列的長度; int pos:本輪搜尋的起始搜尋位置; int sum: 當前已獲得陣列的和

* 第二步,設計dfs終止條件: if( sum == t ) output...

* 第三步 , 剪枝 , 此處的這個剪枝,比較難以理解,建議使用第乙個case ,4 6 4 3 2 2 1 1,在紙上模擬dfs的執行流程,才會有比較透徹的理解

* bb一下,演算法程式雖然短,但是它的思維量還是相當大的,不能偷懶,自己在草稿紙上進行模擬和推導對於理解演算法有很大的幫助.

* ac : 172k 0 ms

*/#include#includeusing namespace std;

// data structure definition

int t , n ;

int a[14]; // 儲存數字列表,如 4 , 3 , 2 , 2 , 1 , 1

int result[14]; // 儲存結果數字列表,如 3 1

int succeed_flag; // 標識著是否找到解

void dfs( int len , int pos , int sum )

{ if( sum == t ) // 結束本次dfs,直接輸出搜尋到的陣列 result

{// 輸出 result

for(int i=0;i

poj1564解題報告

第一次寫部落格,而且是組長強制要求,趕出來的,可能有含糊的地方,但是我會以後再認真分享我的心得的 題意 就是給定乙個n,還有m個數,看看由m個數中任選相加為n的數以特定格式輸出 思路 dfs 但是具體有個東西要注意,那就是要從短到長,從大到小輸出,所以,先選大數再選小數,而給出的數是從大到小,所以也...

dfs模板 去重poj1564

按照降序排序給一組數字,和乙個數t。算出所有t的和的方案 比如1 2 3 4,t為4,t可以是4,也可以是1 3 簡單的dfs題,但是不容易想到如何去重。膜拜大佬 這個模板挺好寫的,就是dfs,然後加起來等於t就輸出,但是不容易想到處理方式。include include include inclu...

菜鳥學演算法之 樹結構

文章出處 作者 李少傑 一 樹的結構 現在通用的說法都是一棵倒著的樹,而我感覺這種結構更像樹根。二 邏輯結構 有兩種結構可以來表示樹 一種是陣列結構 另一種是鍊錶結構 三 不同儲存結構的比較 1.雙親結點指標結構。此結構就是上圖所示的結構,此結構最的問題就是不容易知道乙個結點的子結點數目,如果想知道...