1. 程式人生 > 實用技巧 >xinjun與陰陽師

xinjun與陰陽師

題目描述

xinjun是各類手遊的狂熱粉絲,因隨手一氪、一氪上千而威震工大,現在他迷上了陰陽師。xinjun玩手遊有一個習慣,就是經過層層計算制定出一套方案來使操作利益最大化(因此即使有掃蕩券也不用,故稱聖雄肝帝)。已知陰陽師有N個模式可以操作,模式i有ai種操作,但每種模式每日只能選用一種操作,可以不選。操作j能收益vj,但需要花費體力wj點。xinjun每日擁有體力M點,求他每日最多能得到多少收益。

輸入描述:

第一行一個正整數T(T<=10),表示共有T組資料。

對於每組資料,第一行兩個正整數N,M(1<=N,M<=1000)。

接下來N段資料,每段第一行一個正整數ai(1<=ai<=1000),第二行ai個正整數vj(1<=vj<=1000),第三行ai個正整數wj(1<=wj<=1000)。

每組資料ai之和不大於104。

輸出描述:

對每組資料輸出一行,即xinjun每日最多能得到多少收益。

輸入

1
3 10
2
2 3
3 2
2
1 1
3 4
1
5
5

輸出

9
// 分組揹包模板題
#include<bits/stdc++.h> using namespace std; const int N = 1e3 + 7; int a[N], v[N][N], w[N][N], n, m, dp[N * N]; void solve() { memset(dp, 0, sizeof(dp)); for (int i = 1; i <= n; i++) {
for (int j = m; j >= 0; j--) { for (int k = 1; k <= a[i]; k++) { if (j >= w[i][k]) { dp[j] = max(dp[j], dp[j - w[i][k]] + v[i][k]); } } } } cout << *max_element(dp, dp + 1 + m) << endl; }
void input() { cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> a[i]; for (int j = 1; j <= a[i]; j++) cin >> v[i][j]; for (int j = 1; j <= a[i]; j++) cin >> w[i][j]; } } int main() { int t; cin >> t; while (t--) input(), solve(); return 0; }