题解:P2967 [USACO09DEC] Video Game Troubles G
DiaoHantong · · 题解
题目传送门
思路
本题和
本题的另一种思路是:仍将每个主机及其游戏看作一个组,按已处理的主机数经行阶段划分,设阶段变量
第一步:先忽略第
第二步:再考虑第
在第
代码
#include<bits/stdc++.h>
using namespace std;
int P[55],num[55];//主机价格,包含的游戏数量
int p[55][15],v[55][15];//第i台主机第j款游戏的价格,价值
int f[55][100001],f1[55][100001];
//f[i][j]代表从前i台主机中恰好花费j元购买游戏得到的最大产奶量(伪收益)
//f1[i][j]代表从前i台主机中恰好花费j元购买游戏得到的最大产奶量(真实收益)
int main(){
int n,V;//游戏主机种数,预算
int s=0;
cin>>n>>V;
for(int i=1;i<=n;i++){
cin>>P[i]>>num[i];
for(int j=1;j<=num[i];j++){
cin>>p[i][j]>>v[i][j];
}
}
memset(f,0xcf,sizeof(f));
f1[0][0]=0;
for(int i=1;i<=n;i++){
//第i阶段开始,复制f1[i-1][k]至f[i][k]中
for(int k=0;k<=V;k++)
f[i][k]=f1[i-1][k];
//计算第i阶段的伪收益f[i][k]
for(int j=1;j<=num[i];j++){
for(int k=V;k>=0;k--){
if(k>=p[i][j])
f[i][k]=max(f[i][k],f[i][k-p[i][j]]+v[i][j]);
}
}
//计算第i阶段的真实收益f1[i][k]
for(int k=0;k<=V;k++){
//不选第i台主机
f1[i][k]=f1[i-1][k];
//选第i台主机
if(k>=P[i])f1[i][k]=max(f1[i][k],f[i][k-P[i]]);
}
}
int ans=-1e9;
for(int j=0;j<=V;j++)ans=max(ans,f1[n][j]);
cout<<ans;
return 0;
}