【原創】
在動態規劃中有乙個經典的問題,揹包問題,乙個揹包體積為v,現有n件物品,每件物品都有其價值w和體積v,現在要求將物品裝入揹包,要求使其獲得的價值最大,對這個問題,我們引入乙個概念「價效比」,即價值和體積的比值w/v,表明單位體積的價值量,那麼自然而然我們在選擇物品時,一定是以此選擇」價效比「大的物品,所以在資料處理時必須將物品按照「價效比」按照遞減排序;下面來看乙個題目描述
題目描述:辰辰是個很有潛能、天資聰穎的孩子,他的夢想是稱為世界上最偉大的醫師。
為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。
醫師把他帶到個到處都是草藥的山洞裡對他說:
「孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。
我會給你一段時間,在這段時間裡,你可以採到一些草藥。如果你是乙個聰明的孩子,你應該可以讓採到的草藥的總價值最大。」
如果你是辰辰,你能完成這個任務嗎?
輸入:輸入的第一行有兩個整數t(
1<= t <= 1000)和m(1
<= m <= 100
),t代表總共能夠用來採藥的時間,m代表山洞裡的草藥的數目。
接下來的m行每行包括兩個在1到100之間(包括1和100)的的整數,分別表示採摘某株草藥的時間和這株草藥的價值。
輸出:可能有多組測試資料,對於每組資料,
輸出只包括一行,這一行只包含乙個整數,表示在規定的時間內,可以採到的草藥的最大總價值。
樣例輸入:703
71100691
12
這裡是採藥問題,但是對比揹包,這個問題是一樣的變形,沒有什麼特殊之處,我們來看看**:
#include #include#include
using
namespace
std;
//0-1揹包問題
struct
bag
bool
operator
< (const bag &a) const
}bag_list[
101];
void
test_2()
//for (int i = 1; i<=m; i++)
sort(bag_list+1, bag_list+m+1);//
這個地方是m+1哦,如果下標是0開始,則是m
//for (int i = 1; i<=m; i++)
int ans = 0
;
for (int i =1; i<=m; i++)
}printf(
"%d\n
",ans);
}} intmain()
這裡使用了庫函式,以及結構體中定義函式以及過載操作符的使用,sort是c++函式庫中的函式,這個方法很方便,他對bag_list進行排序,之所以能夠進行主要是因為bag中對《進行了過載,所以能夠自動排序,如果沒有過載,這裡排序是有錯誤的;
動態規劃之揹包問題
最近刷題遇到好幾道揹包問題,揹包問題是動態規則中的一類體型,在考察演算法的筆試中經常遇到。關於揹包問題,文章 揹包問題九講 中已經做了很多分析,這裡就不再細述,建議好好看看這篇文章。然而文章給了許多案例分析,卻沒有很好的練習。說明 1 本文目的不在於講解揹包問題的分析與講解,而是收集了一些揹包問題。...
動態規劃之揹包問題
一 問題描述 有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?二 總體思路 根據動態規劃解題步驟 問題抽象化 建立模型 尋找約束條件 判斷是否滿足最優性原理 找大問題與小問題的遞推關係式 填表 尋找解組成 找出01揹包問題的最優解以及解組成,然後編...
動態規劃之 揹包問題
前些天在做動態規劃的題,感覺動態規劃博大精深,沒有一種特定的模式,學起來很費勁。在這裡就動態規劃中的揹包問題談談。三種揹包問題 0 1揹包,完全揹包,多重揹包。0 1揹包 有n件物品和容量為v的揹包,求解將哪些物品放入揹包中可以使獲得的價值最大。f i v 表示將前i件物品恰好放入容量為v的揹包可以...