HZNUOJ 2041 【C系列综合1】游戏达人I

Description

ACM队的ydw是个游戏的狂热爱好者,他喜好玩各种各样的单机游戏,以可以得到各种不同的结局通关为乐,但是由于时间有限(他还要出题TAT),于是他只能选择自己喜欢的几个结局来通关,由于ydw是游戏达人,因此他可以自己搞定所有的剧情而不去查攻略,但是由于自力更生,完成每个结局的时间是不同的,而他对每一个结局的喜好度也是不同的,即通关每个结局他获得的愉悦度是不同的。他希望在自己有限的时间内可以通关某些结局来使得自己的愉悦度最大。

Input

有多组测试数据,

第1行为N(0<N<=100)和T(0<T<=2000),表示ydw有N个游戏可以玩,玩游戏的总的时间为T。

接下来3*N行,每行第一个数字n(1<=n<=10)表示这个游戏有几种结局,接下来的一行n个数字表示通关某个结局ydw可以获得的愉悦度,再接下来一行的n个数字表示ydw通关某个结局需要的时间。

测试数据以0 0结尾。(数据保证愉悦度和时间均大于0,小于等于1000)

Output

ydw可以获得的最大愉悦度。

Samples

input Copy

1 102 3 54 61 923 5 4 60 0

output Copy

8

5

Hint

第1组数据中,ydw有10的时间去玩1个游戏,2个结局分别耗时为4和6,而愉悦度为3和5,刚好可以达到,则愉悦度为8。

第2组中,时间为9,只能玩1个结局,则最大为5。

原题链接:

https://acm.hznu.edu.cn/OJ/problem.php?id=2041

解题思路:变了形的01背包问题(一眼看穿qwq),直接看代码就好

ac代码:

#include <bits/stdc++.h>
using namespace std;
const int N=100010;
int v[N],t[N],f[N];
int main()
{
    int n,ti;
    while (cin >> n >> ti)
    {
        if(n==0 && ti==0) break;
        memset(f,0,sizeof f);
        int idx1=1,idx2=1;
        while (n--)
        {
            int x;
            cin >> x;
            for (int i=1;i<=x;i++)
            {
                cin >> v[idx1++];//读入数据
            }
            for (int i=1;i<=x;i++)
            {
                cin >> t[idx2++];
            }
        }
        for (int i=1;i<idx1;i++)
        {
            for (int j=ti;j>=t[i];j--)
            {
                f[j]= max(f[j],f[j-t[i]]+v[i]);//01背包
            }
        }
        cout << f[ti] << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值