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;
}