题目描述
许多年前,在欧洲的一个乡村中,有一个被称为“骨头收集者”的巫师。她喜欢收集各种骨头,例如狗,牛的骨头。某天他去了一个埋葬动物的坟墓,带着一个大袋子,最多能装体积为V的骨头。不同的骨头具有不同的骨头值和不同的体积,现在给定沿途的每个骨头的骨头值以及体积,您能否计算出骨头收集者可获得的骨头值总和的最大值?
输入格式
输入包含多组数据,第一行一个整数T,即测试数据的组数。
第二行开始是T个测试数据,每组数据三行,第一行包含两个整数N,V(N <= 1000,V <= 1000),表示骨头的数量和袋子的最大体积。第二行N个整数,为沿途每个骨头的骨头值。第三行N个整数,为沿途每个骨头对应的的体积。
输出格式
每行一个整数,对应每组测试数据,表示能获得骨头值总和的最大值。
输入输出样例
输入样例1:
1 5 10 1 2 3 4 5 5 4 3 2 1
输出样例1:
14
【耗时限制】1000ms 【内存限制】128MB
//
//Created by Carlgood.
//
//Note:This program is written in version DEV-C++ 5.11.
//Subject source:"hppt://oj.codingle.cn"
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<sstream>
#define This_program_is_written_by_Carlgood 9876543210
#define This_code_is_for_reference_only_and_can_not_be_used_for_cheating
using namespace std;
int dp[1002][1002];
int w[1002],v[1002];
int main()
{
int cum=0;
cin>>cum;
for(int sm=cum;sm>=1;sm--)
{
int n,t;
cin>>t>>n;
for(int i=1;i<=t;i++)
{
cin>>w[i];
}
for(int i=1;i<=t;i++)
{
cin>>v[i];
}
for(int i=1;i<=t;i++)
{
for(int j=1;j<=n;j++)
{
if(v[i]>j)
{
dp[i][j]=dp[i-1][j];
}
else
{
dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]);
}
}
}
cout<<dp[t][n]<<endl;
}
return 0;
}