演算法第五章實踐

2022-05-07 14:09:07 字數 760 閱讀 5262

(寫在開頭)

emm,這一次的上機是目前來說最自閉的一次,因為,居然!只做出了一道!看來最近的學習跟刷題還是怠慢了,要加把勁了~

(正文)

第一題,用回溯法實現0-1揹包。一開始直接貼了乙個dfs然後稍微的剪了一下枝,然後發現無論怎麼剪枝,第三第四個樣例都會tle。沒辦法,只好加乙個限界函式,在每一次遞迴前加乙個判斷,減少遞迴次數,最後才把題給a了。

//限界函式

double bound(int i)

if(i<=n)

return b;

}//判斷

if(bound(i+1)>bestv)

第二題,工作分配問題。這題相對而言是最簡單的 (因為上機的時候只做出了這道題)。只需要貼乙個dfs再剪個枝就可以過了。要注意的是剪枝的一種情況:當當前的費用已經超過了當前記錄的最少費用時,就可以直接結束了,因為再遞迴下去,費用也不會比當前記錄的少。要自己注意的是,每一次更換記錄要在葉子節點時才比較,而不是在每乙個子節點,這樣就可以減少比較的次數使程式的效率更快。

if(sum>ans)

第三題,自然數的拆分,這一題是看了其他大佬們的部落格才領悟出來的。一開始只是單純的把數字按順序從後往前挪,直到只剩兩個數,再加乙個判斷。當寫完跑出來發現這個策略會少了一些拆分方法。而看完部落格後使用的策略是:在保證後面的數比前面的數小的同時,使後面的數逐漸增大,並把剩餘的值遞迴到後面。這樣子既可以保證所有拆分方法都可以輸出,並且也會按字典序順序排序。

//查詢函式

void search(int s,int num)}}

演算法第五章上機實踐報告

一 實踐題目 7 2 工作分配問題 二 問題描述 設有n件工作分配給n個人。將工作i分配給第j個人所需的費用為cij 設計乙個演算法,對於給定的工作費用,為每乙個人都分配1 件不同的工作,並使總費用達到最小。輸入格式 輸入資料的第一行有1 個正整數n 1 n 20 接下來的n行,每行n個數,表示工作...

演算法第五章作業

1.你對回溯演算法的理解 回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通...

演算法第五章作業

1.你對回溯演算法的理解 回溯法採用試錯的思想,它嘗試分步的去解決乙個問題。在分步解決問題的過程中,當它通過嘗試發現現有的分步答案不能得到有效的正確的解答的時候,它將取消上一步甚至是上幾步的計算,再通過其它的可能的分步解答再次嘗試尋找問題的答案。2.請說明 子集和 問題的解空間結構和約束函式 問題的...