状态转移方程为
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]);
}
}
}