描述





有N件物品和一个容量为V的背包。第i件物品的容量是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。



输入





输入包括干个测试用例,第一行为一个正整数K(1<=k<=10)表示用例个数,每个用例占三行,第一行为N和V,表示表示物品数量及背包容量,第二行为各物品的容量,第三行为各物品的价值。



输出





每个用例,用一行输出可装入的总大价值。



样例输入


2
5 10
1 1 1 1 1
5 8 6 4 5
4 20
8 7 6 4
14 15 20 9


样例输出


28
44






#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[1000];
int v[1000],w[1000];
int main()
{
int t,n,k,m;
scanf("%d",&t);
while(t--){
scanf("%d %d",&n,&k);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
for(int i=1;i<=n;i++)
scanf("%d",&w[i]);
for(int i=1;i<=n;i++)
{
for(int j=k;j>=v[i];j--)
{
dp[j] = max(dp[j],dp[j-v[i]]+w[i]);
}
}
printf("%d\n",dp[k]);
}
return 0;
}