機試演算法講解 第54題 0 1揹包之如何採藥

2021-07-04 06:28:35 字數 2068 閱讀 9756

/*

揹包:種類:0-1揹包,完全揹包,多重揹包。

0-1揹包:含義:有乙個容量為v的揹包和物品,物品與兩個屬性,體積w和價值v,每種物品只有1個。

要求用這個揹包裝下價值盡可能多的物品,求該最大價值,揹包可以不被裝滿。

特點:每個物品至多能選1件,物品數量只有0和1兩種情況。

dp[i][j]:表示總體積不超過j的情況下,前i個物品所能達到的最大價值

初始化:dp[0][j]=0(0<=j<=s)

關鍵:採用逆序迴圈,保證更新dp[j]時,dp[j-list[i].w]是沒有放入物品i時的資料dp[i-1][j-list[i].w]狀態未因為本次更新發生改變

for(i = 1 ; i <= n ; i++)}}

0-1揹包變體:dp[i][j]:前i個物品總體積恰好為v時所能達到的最大價值,只需改動初始化:dp[0][0]=0,其他dp[0][j]均為負無窮或不存在

完全揹包:乙個容積為v的揹包,同時有n個物品,每個物品均有各自的體積w和價值v,每個物品的數量均為無限個,求試用該揹包最多能裝的物品價值總和。

改動**:每個物品可以被無限次選擇,那麼狀態dp[i][j]恰好可以由可能已經放入物品i的狀態dp[i][j-list[i].w]轉移而來,所以這裡將狀態的遍歷順序變為

順序,使在更新狀態dp[j]時,dp[j-list[i].w]可能因為放入物品i而發生改變。

for(i = 1 ; i <= n ; i++)}}

問題:採藥。不同草藥,採每一株需要一些時間,每一株有自己價值,如何讓採到的價值最大。

輸入:第一行有兩個整數t(1<=t<=1000)和m(1<=m<=100),t代表總共能夠用來採藥的時間,m代表山洞裡的草藥數目。

接下來的m行,每行包括兩個在1到100之間(包括1和100)的整數,分別表示採摘某株草藥的時間和這株草藥的價值

輸出:在規定時間內,可以猜到的草藥的最大總價值

輸入:70(t採藥總時間) 3(m,m行,每行是採藥時間和價值)

71 100

69 1

1 2輸出:

3思路:0-1揹包:每個物品裝或者不裝(揹包中有0個或者1個該物品)。這裡總共時間=容積,物品體積=採摘每個草藥時間。

若物品i放入揹包,體積為w,價值為v,則dp[i][j] = dp[i-1][j-w]+v。即在總體積不超過j-w時,前i-1件物品可組成的最大價值的基礎上再

加上i物品的價值v。若物品不加入揹包,則dp[i][j]=dp[i-1][j]。

狀態轉移方程:

dp[i][j] = max;

注意:j-w的值是否為負值,若為負,則轉移**能被轉移。

目標狀態:dp[n][s]

關鍵:1 0-1揹包狀態轉移方程:dp[i][j] = max;,用 j >= list[i].w作區分,優化後的轉移方程:dp[j] = max

2 目標狀態是:dp[n][s],s是總容量,n是物品總數

3 必須宣告乙個結構list:v,w表示價值和體積

4 倒序遍歷j,保證確定dp[j]的值時,dp[j-list[i].w]的值尚未被修改

5 0-1揹包複雜度=狀態數量*狀態轉移複雜度=(物品數量n*揹包總容積s)*o(1)=o(n*s),優化過後空間複雜度為o(s)

*/#include #include #include //定義揹包

typedef struct list

list;

int max(int a,int b)

int main(int argc,char* argv)

//初始化狀態量

for(i = 0 ; i <= s ; i++)

//對於時間足夠的情況,狀態**是:dp[i][j]為兩者之中的最大值

for(i = 1 ; i <= n ; i++)

/*for(j = list[i].w-1; j >= 0 ; j--)

*/} //printf("%d\n",dp[n][s]);

printf("%d\n",dp[s]);

} system("pause");

getchar();

return 0;

}

機試演算法講解 第55題 Piggy Bank

問題 與乙個儲蓄罐,告知空的質量和當前重量,並給定一些錢幣的價值和相應的重量,求儲蓄罐中最少有多少現金。輸入 包含t組測試用例。第一行。每乙個測試用例包含2個整數e和f,表明空儲蓄罐的重量和裝滿錢的重量。10,000g,第二行是每個測試用例,包含乙個整數n 1 n 500 給出了各種硬幣的數量。接下...

機試演算法講解 第58題 輸入外掛程式

輸入外掛程式 scanf快於 cin,在scanf基礎上再次優化,使那些剛超時一點的程式能夠卡金時限範圍。原理 在讀入緩衝中字元的前提下,手動分析字串中輸入的整數 浮點數等我們需要的輸入型別,並將其儲存在變數中 include include include 輸入整數,並將整數儲存在引用變數ret中...

機試演算法講解 第7題 輸出梯形

問題 輸入高度h,輸出高為h,上底邊圍h的梯形 思路 由於多出的底邊x可以設為任意值,不放設x h 第1行,h h 第2行,列印h 1個空格,1個 然後列印h個空格,再列印1個 h 2 1 3 h 2 1 h 2 1 1個 h 2 2 4 h 3個空格,1個 h 2 2 1個 h 1 2 1個 h ...