问题 J: 流浪西邮之寻找火石碎片

本文介绍了一种在有限资金和积分下,通过收集不同大小和能量的火石碎片,以最大化重启发动机推力的策略。该策略适用于多高校竞争环境下,如何最优利用资源赢得比赛。

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

众所周知,由于木星引力的影响,世界各地的推进发动机都需要进行重启。现在你接到紧急任务,要去收集火石碎片,重启西邮发动机。现在火石碎片已成为了稀缺资源,获得火石碎片需要钱或者需要一定的积分。火石碎片有大有小,越大的碎片能量越大,火石碎片的能量越大,重启的发动机的推力也就越强。但是,不只有我们在努力呀,隔壁的师大和政法也都在收集碎片,争取重启师大发动机和政法发动机,哪个高校重启的发动机推力最大,就能代表长安区大学城为世界做出贡献,从而在史书上留下浓墨重彩的一笔。
现在你有v1块钱,v2积分,能免费(免积分)收集k个火石碎片,现在总共有n个火石碎片,每个碎片需要的钱a或者积分b,碎片的能量为val。我们希望收集火石碎片,使能量的总和尽可能大,问你skyer_hxx最多可以拿到能量总和的最大值是多少?

输入

输入包含多组测试用例。
每组数据的第一行是四个整数n,v1,v2,k;
然后是n行,每行三个整数a,b,val,分别表示每个碎片的价钱,兑换所需积分,所含能量。
1≤n≤100
0≤v1,v2≤100
0≤k≤5
0≤a,b,val≤100

输出

对于每组数据,输出能得到的最大能量值。

样例输入
复制样例数据 4 5 2 1
2 2 4
4 5 1
4 2 4
2 2 5

样例输出
14

int main()
{

    int n,v1,v2,k;
  while(cin>>n>>v1>>v2>>k)///多组数据输入
  {
    int dp[105][105][10]={0};///三种物品,开三个维
    int w1[105],w2[105],val[105];
    for(int i=1;i<=n;i++) cin>>w1[i]>>w2[i]>>val[i];
    for(int i=1;i<=n;i++)///四重循环
    {
        for(int j=v1;j>=0;j--)///j>=0,而不是j>=w1[i],因为j可以<w1[i](用钱买不起),而l>w2[i](可以用积分买)
        {
            for(int l=v2;l>=0;l--)///同理
            {
                for(int m=k;m>=0;m--)///同理,所以要在循环内判断
                {
                    if(j>=w1[i]) dp[j][l][m]=max(dp[j][l][m],dp[j-w1[i]][l][m]+val[i]);
                    if(l>=w2[i]) dp[j][l][m]=max(dp[j][l][m],dp[j][l-w2[i]][m]+val[i]);
                    if(m>=1) dp[j][l][m]=max(dp[j][l][m],dp[j][l][m-1]+val[i]);
                    //cout<<dp[j][l][m]<<endl;
                }
            }
        }
    }
    cout<<dp[v1][v2][k]<<endl;
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值