/* 好久没有用java写了。代码写的好丑的,简单的0 - 1背包 DP[i][j]表示前i个物品,背包容量为j的最优值 状态转移方程为 DP[i][j] = max(DP[i-1][j] , DP[i-1][j-v[i]] + w[i]); 时间复杂度N*V , 空间复杂度N*V 所以伪代码如下: for i = 所有物品 for j = V to v[i] dp[j] = max(dp[j] , dp[j-v[i]] + w[i]); 空间优化到一维V */ import java.io.*; import java.util.*; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(new BufferedInputStream(System.in)); int t; t = cin.nextInt(); //while(t--) for(int k = 1; k <= t; k++) { int n, v; int a[]; a = new int [1000]; int b[]; b = new int [1000]; n = cin.nextInt(); v = cin.nextInt(); for(int i = 1; i <= n; i++) { a[i] = cin.nextInt();//价值 } for(int i = 1; i <= n; i++) { b[i] = cin.nextInt();//体积 } int sum[]; sum = new int [1000]; int dp[][]; dp = new int [1001][1001]; for(int i = 0; i < 1001; i++) //for(int j = 0; j < 1001; j++) dp[0][i] = 0; // Arrays.fill(dp, (int)0); for(int i = 0; i <= v; i++) sum[i] = 0; for(int i = 1; i <= n; i++) for(int j = 0; j <= v; j++) { if(b[i] > j) { dp[i][j] = dp[i - 1][j]; continue; } if(dp[i - 1][j] > dp[i - 1][j - b[i]] + a[i]) dp[i][j] = dp[i - 1][j]; else dp[i][j] = dp[i - 1][j - b[i]] + a[i]; } for(int i = 1; i <= n; i++) for(int j = v; j >= b[i]; j--) { if(sum[j] < sum[j - b[i]] + a[i] ) sum[j] = sum[j - b[i]] + a[i]; //System.out.println(sum[j]); } //System.out.println(sum[v]); System.out.println(dp[n][v]); } } }