【洛谷P2967】【USACO 2009 Dec】電子遊戲 Video Game Troubles

問題描述

約翰的奶牛們玩遊戲成癮!原本約翰是想把她們拖去電擊治療的,後來他發現奶牛們在生產了更多的牛奶,也就開始支持她們了。spa

可是,奶牛在選擇遊戲平臺上的分歧很大:有的奶牛想買一臺 Xbox 360來跑《光暈 3》;有的奶牛想要一臺任天堂Wii來跑《明星大亂鬥X》; 還有的奶牛想要在PlayStation 3 上玩《潛龍諜影4》。看來約翰要作一些選擇才行。code

已知市面上有N種平臺,若是想玩第i種平臺的遊戲,必須先買一臺該平臺上的遊戲機,價格爲Pi。第i種平臺上有Gi種遊戲,其中第j個遊戲的價格爲GPi,j,奶牛玩過該遊戲後的牛奶產出爲PVi,j.若是想玩同一平臺上的多個遊戲,只要買一臺遊戲機就夠了。blog

假設約翰的總預算不能超過V。請幫他考慮一下,購買哪些遊戲機和遊戲,才能使奶牛產奶的效益最大?注意一個遊戲玩兩次是不會有雙倍效益產生的。遊戲

輸入格式

第一行:兩個用空格分開的整數N和V,1 ≤ N ≤ 50,1 ≤ V ≤ 106io

第二行到第N + 1行:第i + 1行描述了第i個遊戲平臺。首先是Pi。接着是Gi,其次有Gi對整數GPi,j和PVi,j,1 ≤ Pi ≤ 1000,1 ≤ Gi ≤ 10,1 ≤ GPi,j ≤ 100,1 ≤ PVi,j ≤ 106模板

輸出格式

第一行:單個整數,表示約翰能夠獲得的最高產出class

樣例輸入

3 800
300 2 30 50 25 80
600 1 50 130
400 3 40 70 30 40 35 60 di

樣例輸出

210co

提示

購買第一種遊戲機上的第二個遊戲和第三種遊戲機上的第1、第三個遊戲,預算爲300 + 25 + 400 + 40 + 35 = 800,收益爲80 + 70 + 60 = 210360

題解

設f[j][0/1] 表示前i個遊戲平臺價格不超過j元的最大效益,因爲要買遊戲機,第i個遊戲平臺實際能夠用的錢爲j-p[i],而後就直接用01揹包的模板了。

有可能不買第i個遊戲平臺的遊戲機和全部遊戲能夠得到更大的效益,f[j][0]存儲前i-1個遊戲平臺的最大收益,即不買第i個遊戲平臺的最大收益,f[j][1]用來推前i個遊戲平臺的最大收益,最後前i個遊戲平臺的最大收益爲max(f[j][0],f[j][1])

 

 1 #include <cstdio>
 2 int n,m,p[55],g[55],w[55][15],v[55][15],f[1000005][2];
 3 int max(int x,int y)
 4 {
 5     return x>y?x:y;
 6  } 
 7 int main()
 8 {
 9     int i,j,k;
10     scanf("%d%d",&n,&m);
11     for (i=1;i<=n;i++)
12     {
13         scanf("%d%d",&p[i],&g[i]);
14         for (j=1;j<=g[i];j++)
15           scanf("%d%d",&w[i][j],&v[i][j]);
16     }
17     for (i=1;i<=n;i++)
18     {
19         for (j=p[i];j<=m;j++)
20           f[j][1]=f[j-p[i]][0];
21         for (j=1;j<=g[i];j++)
22           for (k=m-w[i][j];k>=p[i];k--)
23             f[k+w[i][j]][1]=max(f[k+w[i][j]][1],f[k][1]+v[i][j]);  
24         for (j=p[i];j<=m;j++)
25           f[j][0]=max(f[j][0],f[j][1]);
26     }
27     printf("%d",f[m][0]);
28     return 0;
29 }
相關文章
相關標籤/搜索