Hdu2602

//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);
}


你可能感兴趣的:(背包)