jzoj P1593 电视游戏问题

本文介绍了一道关于游戏平台购买的问题,玩家需要在有限预算内选择游戏平台及游戏以最大化收益。通过动态规划的方法,设置了两种状态转移方程来解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意

有N种游戏平台,每一种游戏平台的价格是P_i,并且每一种游戏平台有G_i个只能在这种平台上运行的游戏。
必须先买进一种游戏平台,才能买进在这种游戏平台上运行的游戏。
每一个游戏有一个游戏的价格GP_j,并且有一个产出值PV_j,表示一只牛在玩这个游戏之后会产出多少牛奶。
最多可以花费的金钱为V,求获得的产出值的和最大是多少。

1 <= N <= 50
1 <= P_i <= 1000
1 <= G_i <= 10
1 <= GP_j 价格 <= 100
1 <= PV_j<= 1000000
1 <= V <= 100000

题解:

这题应该很容易就想到用DP去做:
怎么实现呢?
①我们设f[i,j]表示前i个游戏平台用了j元能获得的最大产出值!
不过这样很明显无法做到最优,因为存在可选可不选的情况,所以我们考虑这2中情况可以设状态转移方程:
f[i,j,1]表示前i个游戏平台用了j元,且不选第i个游戏平台的最大产出值。
f[i,j,2]则表示选了第i个游戏平台的最大产出值.

然后
f[i,j,1]=max(f[i-1,j,1],f[i-1,j,2])
f[i,j,2]的初值则为max(f[i-1,j-p[i],1],f[i-1,j-p[i],2])
后面对f[i,j,2]的转移
就可以得出
f[i,j,2]=max(f[i,j,2],f[i,j-gp_k,2]+pv_k)

var
    f:array [0..51,0..100001,1..2] of longint;
    p,c,x,y,i,j,n,m,k:longint;

function max(aa,bb:longint):longint;
begin
    if aa>bb then exit(aa);
    exit(bb);
end;

begin
   assign(input,'vidgame.in'); reset(input);
   assign(output,'vidgame.out'); rewrite(output);
    readln(n,m);
    for i:=0 to m do
      for j:=1 to 2 do f[1,i,j]:=-maxlongint;
    for i:=1 to n do
      begin
           read(p,c);
           for j:=0 to m do
           begin
              f[i,j,1]:=max(f[i-1,j,1],f[i-1,j,2]);
              if j<p then f[i,j,2]:=-maxlongint
                     else f[i,j,2]:=max(f[i-1,j-p,1],f[i-1,j-p,2]);
            end;
           for k:=1 to c do
            begin
                 read(x,y);
                 for j:=m downto x do
                   f[i,j,2]:=max(f[i,j-x,2]+y,f[i,j,2]);
            end;
           readln;
      end;
    writeln(max(f[n,m,1],f[n,m,2]));
    close(input); close(output);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值