再次理解DFS(POJ1014)

2021-06-05 14:29:32 字數 1495 閱讀 5814

原題目:

題目大意:

有分別價值為1,2,3,4,5,6的6種物品,輸入6個數字,表示相應價值的物品的數量,問一下能不能將物品分成兩份,是兩份的總價值相等,其中乙個物品不能切開,只能分給其中的某一方,當輸入六個0是(即沒有物品了),這程式結束,總物品的總個數不超過20000

輸出:每個測試用例佔三行:

第一行:collection #k: k為第幾組測試用例

第二行:是否能分(具體形式見用例)

一直以為自己已經掌握了dfs。今天遇到poj1014題目,準備深搜一下。沒有用遞迴,記得老師說過對任何遞迴演算法都能用非遞迴演算法實現。然後就認真地開始寫**,深知動手越快越容易錯,我還畫了棵樹,大概條理了一下深搜的過程。看起來似乎很正確,沒有任何問題。可是還是那句老話:除非你用**將系統實現,並讓它動起來,否則你無法真正了解它會有什麼問題。按照自己的思路寫完之後,開始測試,問題就暴露出來,又少考慮某些情況下需要回溯的問題了。

讓我們分析如下兩圖的搜尋情況:

一: 沒有經過深入思考,我採用了第一種深搜方式,如果sum繼續往下探索,如果大於則回溯到上一層,證明上一層選的不合適。認真分析就會發現問題,(1)這個樹中的搜尋路徑很明顯不支援同乙個數字的若干次選取。(2)僅僅只有六層。這怎麼可以呢!照此說不管怎麼遍歷都是1+2+3+4+5+6.真是汗顏啊怎麼寫出這麼個無厘頭的程式呢!

二: 這種搜尋是合理的。每次探測都可以有六種選擇,也可以想象成從六個盒子裡面拿東西,每次從六個盒子裡選一種,第一種出現的兩種錯誤都可以避免掉。而且每個節點的度都是6,而且特徵一樣。這個非常好,對每個節點的處理都一樣。很明顯可以遞迴。符合dfs的特點。

#includeusing namespace std;

int amount[7] = ;

int half_value = 0;

int flag = 0;

void dfs(int value, int pre)

if(flag == 1)

int i = 0;

for(i = pre; i > 0; i--)

}} }

}int main()

if(!amount[1] && !amount[2] && !amount[3] && !amount[4] && !amount[5] && !amount[6])

printf("collection #%d:\n", testcase++);

if(totalvalue % 2 != 0)

half_value = totalvalue / 2;

dfs(0, 6);

if(flag) else

cout << endl;

} return 0;

}

session再次理解

1.session介紹 session主要用來儲存使用者的會話所需的資訊 使用者行為資訊 當使用者在同乙個伺服器上實現不同的操作時,session資訊會以變數的形式儲存在伺服器的記憶體中,儲存使用者的狀態資訊,使用者第一次訪問服務時,伺服器上不存在該使用者session的資訊,會為其建立乙個sess...

session再次理解

1.session介紹 session主要用來儲存使用者的會話所需的資訊 使用者行為資訊 當使用者在同乙個伺服器上實現不同的操作時,session資訊會以變數的形式儲存在伺服器的記憶體中,儲存使用者的狀態資訊,使用者第一次訪問服務時,伺服器上不存在該使用者session的資訊,會為其建立乙個sess...

MVVM的再次理解

mvvm的理解 mvvm model view viewmodel 我要著重介紹的是viewmodel,從字面意思就能看出viewmodel是view層的model,也就是說viewmodel就是view的邏輯層。viewmodel就是為了儲存view的相關狀態 行為,而不僅僅是view繫結的一些字...