動態規劃(五)

2021-08-15 10:57:27 字數 1754 閱讀 5494

1.開心的金明

金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:「你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過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]。(其中*為乘號)

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

輸入格式:

輸入的第1行,為兩個正整數,用乙個空格隔開:

n m(其中n(<30000)表示總錢數,m(<25)為希望購買物品的個數。)

從第2行到第m+1行,第j行給出了編號為j-1的物品的基本資料,每行有2個非負整數

v p(其中v表示該物品的**(v<=10000),p表示該物品的重要度(1~5))

輸出格式:

輸出只有乙個正整數,為不超過總錢數的物品的**與重要度乘積的總和的最大值(<100000000)。

輸入樣例:

1000 5

800 2

400 5

300 5

400 3

200 2

輸出樣例:3900

演算法分析:這個題就是01揹包問題,這裡的總錢數相當於揹包總容量,物品**和重要度的乘積相當於揹包所盛東西的價值。

#includeusing namespace std;

int n,m,p;

int v[100001],s[100001],f[100001];

int max(int x,int y)

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

cout<2.裝箱問題

有乙個箱子容量為v(正整數,0<=v<=20000),同時有n個物品(0<n<=30,每個物品有乙個體積(正整數)。

要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。

輸入格式:

乙個整數,表示箱子容量

乙個整數,表示有n個物品

接下來n行,分別表示這n 個物品的各自體積

輸出格式:

乙個整數,表示箱子剩餘空間。

輸入樣例#1:2468

31279

7

輸出樣例#1:

0

分析:這道題的問法和之前見過的揹包問題不同,但是只是輸出的結果有點兒差別罷了,之前輸出的是最大價值,現在輸出的是總容量減去所盛物品的體積,其實質還是一樣的。

#includeusing namespace std;

int v,n;

int c[100001],f[100001];

int max(int x,int y)

{ if(x>v;

cin>>n;

for(int i=1;i<=n;i++) cin>>c[i];

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

for(int j=v;j>=c[i];j--)

if(f[j-c[i]]+c[i]>f[j])

f[j]=f[j-c[i]]+c[i];

cout<

動態規劃學習日記(五)

12 3 10 r 1,2 min 2 0r 2,3 30 例6 租用遊艇問題 例 問題描述 長江遊艇俱樂部在長江上設定了n個遊艇出租站1,2,n.遊客可在這些遊艇出租站租用遊艇,並在下游的任何乙個遊艇出租站歸還遊艇.遊艇出租站i到出租站j之間的租金為r i,j 1 i演算法設計 對於給定的遊艇出租...

動態規劃經典五題

雖然最大子矩陣,滑雪,石子合併等問題也足夠經典,我還是從中找了5道最經典的dp寫了這篇博文。有n 件物品和乙個容量為 v的揹包。第 i件物品的費用是 c i 價值是 w i 求解將哪些物品裝入揹包可使價值總和最大。轉移方程 dp i j max dp i 1 j dp i 1 j weight i ...

LeetCode刷題 動態規劃(五)

上一節總結了 0 1揹包,接著總結 完全揹包。在做題中總結套路,事半功倍!引入322,零錢兌換,medium 518,零錢兌換 medium 377,組合總和 medium 139,單詞拆分,medium 完全揹包問題總結 引入 完全揹包的變體問題 物品可以無限次選取,且考慮物品放入的順序。下面在具...