動態規劃 1

2021-08-15 10:44:56 字數 1308 閱讀 8459

p1060 開心的金明、---揹包問題

金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:「你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n元錢就行」。今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n元。於是,他把每件物品規定了乙個重要度,分為5等:用整數1~5表示,第5等最重要。他還從網際網路上查到了每件物品的**(都是整數元)。他希望在不超過n元(可以等於n元)的前提下,使每件物品的**與重要度的乘積的總和最大。

設第j件物品的**為v[j],重要度為w[j],共選中了k件物品,編號依次為j1,j2,……,jk,則所求的總和為:

v[j1]*w[j1]+v[j2]*w[j2]+ …+v[jk]*w[jk]。(其中*為乘號)

請你幫助金明設計乙個滿足要求的購物單。

#include#includeusing namespace std;

int v[30001],w[30001],f[30001]=,n,m;

int maxy(int x,int y)

int main()

for(int i=1;i<=m;i++) //m件物品

for(int j=n;j>=v[i];j--) //不超過物品價值的j

cout《揹包問題主要是背模板,這裡收錄了一些模板

一些複雜的揹包問題(如泛化物品)未收錄

01揹包問題:

無優化for(int i=1;i<=n;i++)

}

一維陣列優化:

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

}

更進一步的常數優化:

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

}

完全揹包問題:

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

}

多重揹包問題:

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

}else

amount-=k;

k<<=1;

} for(int c=amount*w[i];c>=0;c--)

} }

下面來到我們的正題:首先判斷是否為揹包問題,可見其揹包就是money的總數,質量就是重要度*money

可以套用揹包問題

有根據其特性可知這是01揹包

到此建模完成,思考+讀題用時3min

動態規劃1

維基百科 動態規劃是一種在數學和 電腦科學 中使用的,用於求解包含 重疊子問題 的最優化 問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態規劃的思想是多種演算法的基礎,被廣泛應用於電腦科學和工程領域。比較著名的應用例項有 求解 最短路徑 問題,揹...

動態規劃 1

動態規劃是對最優化問題的一種新的演算法設計方法。由於各種問題的性質不同,確定最優解的條件也互不相同,因而動態規劃的沒計法對不同的問題,有各具特色的表示方式。不存在一種萬能的動態規劃演算法。但是可以通過對若干有代表性的問題的動態規劃演算法進行討論,學會這一設計方法。多階段決策過程最優化問題 動態規劃的...

動態規劃1

首先,動態規劃的最基本要求在於無後效性 即結果態之和之前某態有關,並且對於該之前態我們並不關心它到底是怎麼來的 和n到n 1的跳躍一樣,它也是依賴轉移方程得來。比如0 1揹包 我們只要永遠依賴dp i j max dp i 1 j,dp i 1 j wi vi 這個轉移方程即可,並不在乎它具體細節。...