现在我们有N个配件,他们有不同的价值. 但是我们背包的容量是有限的,因为我们只有一个一级包, 所以我们最多可以装V重量的东西. 但是为了能更好的吃到鸡(不存在的)我们要携带更有价值的配件,请问我们最多能拿多少价值的配件来当快递员呢??
Input
输入的第一行是T, 表示有一共要打T场比赛.
每组数据由三行组成.
第一行包含两个整数N和V(N <= 1000, V <= 1000). N表示配件的个数, V表示一级包的大小(系统会更新嘛).
第二行包含N个整数, 表示每一个配件的价值.
第三行包含N个整数, 表示每个配件的重量.
Output
对每一组数据, 输出我们最多能拿多少价值的配件.
Sample Input
1 10 10 1 3 5 7 9 11 13 15 17 19 19 17 15 13 11 9 7 5 3 1
Sample Output
51
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
int value[1005],h[1005];
int dp[20000];
int max(int a,int b)
{
return a > b?a:b;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,v;
scanf("%d %d",&n,&v);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
scanf("%d",&value[i]);
}
for(int i=1;i<=n;i++)
{
scanf("%d",&h[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=v;j>=h[i];j--)
{
dp[j] = max(dp[j],dp[j-h[i]] + value[i]);
}
}
sort(dp,dp+v);
printf("%d\n",dp[v]);
}
return 0;
}