原題目:
題目大意:
有分別價值為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繫結的一些字...