#P2865. USACO(120)动态规划(背包型)8:电子游戏P2967 [USACO09DEC] Video Game Troubles
USACO(120)动态规划(背包型)8:电子游戏P2967 [USACO09DEC] Video Game Troubles
Description
【题目描述】已知市面上有 $K$ 种游戏平台,如果想玩第 $i$ 种平台的游戏,必须先买一台该平台的游戏机,价格为 $C_i$ 。第 $i$ 种平台上有 $S_i$ 种游戏,其中第 $j$ 个游戏的价格为 $P_{i,j}$ ,奶牛玩过这个游戏后的产出为 $E_{i,j}$ 。如果想玩同一平台上的多个游戏,只要买一台游戏机就够了。请帮助约翰选择买哪些游戏机和游戏,才能使奶牛的产奶效益之和最大?注意同一个游戏买两次是不会产生双倍效益产生的。
【输入格式】
•第一行:两个整数 $K$ 和 $V$ ,$1 \le K \le 50$,$1 \le V \le 10^6$
•第二行到第 $K+1$ 行:第 $i+1$ 行首先有两个整数 $C_i$ 和 $S_i$ ,$1 \le C_i \le 10^6$,$1 \le Si \le 10$,其次有 $S_i$ 对整数 $P_{i,j}$ 和 $E_{i,j}$ ,$1 \le P_{i,j} , E_{i,j} \le 10^6$
【输出格式】
•单个整数:表示可以得到的最大产出之和
【样例输入】
3 800
300 2 30 50 25 80
600 1 50 130
400 3 40 70 30 40 35 60
【样例输出】
210
【解释】
购买第一种游戏平台上的第二个游戏,以及第三种游戏平台上的第一个和第三个游戏,恰好花去300+25+400+40+35=800元,产出为80+70+60=210
Hint
by cff_0102:#include<bits/stdc++.h>
using namespace std;
const int K=55,V=1e6+5;
int dp[2][V];
int main(){
ios::sync_with_stdio(0);cin.tie(0);
int k,v;cin>>k>>v;
for(int i=1;i<=k;i++){
int c,s;cin>>c>>s;
for(int j=c;j<=v;j++)dp[1][j]=dp[0][j-c];
while(s--){
int p,e;cin>>p>>e;
for(int j=v;j>=c+p;j--){
dp[1][j]=max(dp[1][j],dp[1][j-p]+e);
}
}
for(int j=0;j<=v;j++)dp[0][j]=max(dp[0][j],dp[1][j]);
}
cout<<dp[0][v];
return 0;
}