1.列舉
列舉法,也稱作窮舉,指的是從問題所有可能的解的集合中一一枚舉各元素。題目中給定的檢驗條件判定哪些是無用的,哪些是有用的。
優點是演算法簡單,在區域性地方使用列舉法,效果十分好。缺點是運算量過大,當問題的規模變大的時候,迴圈的階數越大,執行速度越慢。
例題:百錢買白雞問題:有乙個人有一百塊錢,打算買一百隻雞。到市場一看,公雞乙隻3元,母雞乙隻5元,小雞3只1元,試求用100元買100隻雞,各為多少才合適?
解析:根據題意可以得到方程組:3x+5y+z/3=100;x+y+z=100;
#includeusing namespace std;
int main()
int main()
return c;
}int main()
利用優先佇列的方法優化
普通的佇列是一種先進先出的資料結構,元素在佇列尾追加,而在佇列頭刪除。在優先佇列中,元素被賦予優先順序。當訪問元素時,具有最高優先順序的元素最先刪除。優先佇列具有最高端先出的行為特徵。通常採用堆資料結構來實現。
priority_queue
基本操作:
empty():如果隊列為空,則返回真
pop():刪除對頂元素,刪除第乙個元素
push():加入乙個元素
size():返回優先佇列中擁有的元素個數
top():返回優先佇列對頂元素,返回優先佇列中有最高優先順序的元素
標頭檔案:#include
宣告方式:
1.普通方法
priority_queueq;//通過操作,按照元素從大到小的順序出隊
priority_queue,greater> q;//通過操作,按照元素從小到大的順序出隊
2、自定義優先順序:
struct cmp
};priority_queue, cmp> q; //定義方法
//其中,第二個引數為容器型別。第三個引數為比較函式。
3、結構體宣告方式:
struct node
};priority_queueq; //定義方法
//在該結構中,y為值, x為優先順序。
//通過自定義operator《操作符來比較元素中的優先順序。
//在過載」<」時,最好不要過載」>」,可能會發生編譯錯誤
#include#includeusing namespace std;
int main()
while(p.size()>=2)
cout
}
遞迴演算法 貪心演算法
思維方式 把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解。關鍵點 遞迴邊界及遞迴定義 大型問題與小型問題之間的關係 記憶化搜尋 遇到重疊的子問題直接呼叫其結果。解題通常的三步驟 1 分析問題 尋找遞迴 找出大規模問題與小規模問題之間的關係 2 紳士邊界 控制遞迴 找出終止條件 ...
演算法之列舉和貪心
列舉 亦稱窮舉 演算法 原理 列舉法的本質就是從所有候選答案中去搜尋正確的解,使用該演算法需要滿足兩個條件 1 可預先確定候選答案的數量 2 候選答案的範圍在求解之前必須有乙個確定的集合。核心思想 列舉所有的可能。列舉演算法簡單粗暴,他暴力的列舉所有可能,盡可能地嘗試所有的方法。雖然列舉演算法非常暴...
演算法初入門 氣泡排序
氣泡排序演算法的流程如下 1.比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。3.針對所有的元素重複以上的步驟,除了最後乙個。4.持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需...