//Bone Collector
//0/1背包问题
#include<stdio.h>
#include<string.h>
int max(int a,int b);
int main(){
/* struct fuc{
int value;
int volume;
}b[1005];
int t,n,v,i,j,f[1005];
while(scanf("%d",&t)!=EOF){
while(t--){
scanf("%d%d",&n,&v);
for(i=0;i<n;i++){
scanf("%d",&b[i].value);
}//Input:value
for(i=0;i<n;i++){
scanf("%d",&b[i].volume);
}//Input:volume
memset(f,0,sizeof(f));
for(i=0;i<n;i++){
for(j=v;j>=0;j--){
if(j>=b[i].volume) f[j]=max(f[j],f[j-b[i].volume]+b[i].value);
}
}
printf("%d\n",f[v]);
}滚动数组,需要打印时慎用!
}*/
int t,n,v,i,j,value[1005],volume[1005];
static int d[1005][1005];//
while(scanf("%d",&t)!=EOF){
while(t--){
scanf("%d%d",&n,&v);
for(i=0;i<n;i++)
scanf("%d",&value[i]);
for(i=0;i<n;i++)
scanf("%d",&volume[i]);
memset(d,0,sizeof(d));//
for(i=n-1;i>=0;i--){
for(j=0;j<=v;j++){
d[i][j]=d[i+1][j];//d[i][j]=(i==n-1?0:d[i+1][j]);
if(j>=volume[i]) d[i][j]=max(d[i][j],d[i+1][j-volume[i]]+value[i]);//状态转移方程
}
}
printf("%d\n",d[0][v]);
}
}
return 0;
}
int max(int a,int b){
return(a>b?a:b);
}
转载于:https://blog.51cto.com/22222222222/1710735