題目大意:
水房能容納飲料的總量是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頁。雖然我不是天天看,但是一旦我看了乙個問題之後,我就希望能夠把這個問題在演算法層面分析透,這份專注是我以前看...