程式設計之美 飲料供貨

2021-06-20 18:58:07 字數 1189 閱讀 8304

題目大意:

水房能容納飲料的總量是v,有一批飲料,每種飲料單個容量都是2的方冪,每種飲料資訊如下:(si,vi,ci,hi)分別對應(名字,容量,滿意度),求在滿足總容量等於v的情況下,求滿意度的最大值。

分析:

1、動態規劃解法,不難看出這是一道完全揹包問題

具體思路解法見:第七章 揹包問題——完全揹包

2、動態規劃法的變形:備忘錄法

#include #include using namespace std;

#define inf 0x7fffffff

const int n=3;//飲料種數

const int v=8;//水房容量

int c[n+1]=; //ci表示第i種飲料的容量 (i從1開始)

int h[n+1]=; //w[i]表示第i種飲料的滿意度

int dp[n+1][v+1];

int cal(int n,int v)

if(v<0)return -inf;

else if(v==0)

return 0;

else if(dp[n][v]!=-1)

return dp[n][v];

int ret=-inf;

for(int i=0;i<=v/c[n];i++)

} return dp[n][v]=ret;

} int main()

bucket[cnt][length[cnt]++]=&water[i];

} //每個類別按照滿意度進行排序,選出滿意度最高的此類飲料

for(int i=0;i<20;i++)

//store[i]陣列儲存如要拿2^i容量的飲料所獲得的最大滿意度

int store[20];

memset(store,-1,sizeof(store));

store[0]=length[0]>0?bucket[0][0]->h:-1;

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

//將v轉化成2進製資料求總滿意度

int h=0;//總滿意度

int c=0;//總容量

int v=v;

int k=0;

while(v>0)

cout<<"總容量為"<

程式設計之美 飲料供貨

動態規劃解之 view code 1 2 總共n中飲料,每種飲料表示為 s i v i c i h i b i s表示名稱,v表示容量,c表示可能的最大容量,h表示滿意度,b表示實際購買量 3v i b i 求和 v的情況下,h i b i 求和最大化4 56 include 7using name...

1 6 飲料供貨

問題 總共n中飲料,每種飲料表示為 s i v i c i h i b i s表示名稱,v表示容量。c表示能夠買的最大數量,h表示愜意度,b表示實際購買量 在v i b i 求和 v的情況下,h i b i 求和最大化 最優化。毫無疑問。考慮動態規劃跟貪心。狀態轉移方程 設opt v i 表示從 i...

《程式設計之美》讀書筆記(五) 飲料供應問題

從買書那天算起,到今天已經過了半個多月。這段時間說短不短,如果是一本 300多頁的 的話,我大概一天就能搞定 我的記錄是一天一千多頁 大唐雙龍傳 但是到現在 程式設計之美 我只看了不到 50頁。雖然我不是天天看,但是一旦我看了乙個問題之後,我就希望能夠把這個問題在演算法層面分析透,這份專注是我以前看...