Bone Collector
Descripción del problema
Hace muchos años, en la ciudad natal de Teddy había un hombre que se llamaba "Bone Collector". A este hombre le gusta recolectar varios huesos, como los de perros, vacas, también fue a la tumba ...
El recolector de huesos tenía una gran bolsa con un volumen de V, y en su viaje de recolección hay muchos huesos, obviamente, diferentes huesos tienen diferentes valores y diferentes volúmenes, ahora dado el valor de cada hueso a lo largo de su viaje, ¿puede calcular el máximo del valor total que puede obtener el colector de huesos? ``
Entrada
La primera línea contiene un número entero T, el número de casos .
Seguido de T casos, cada caso tres líneas, la primera línea contiene dos enteros N, V, (N <= 1000, V <= 1000) que representan el número de huesos y el volumen de su bolsa. Y la segunda línea contiene N enteros que representan el valor de cada hueso. La tercera línea contiene N enteros que representan el volumen de cada hueso.
Salida
Un número entero por línea que representa el máximo del valor total (este número será menor que 231).
Entrada de muestra
1 5
10 1 2 3 4 5 5 4 3 2 1
Salida de muestra
14
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 1e5 + 10;
int w[maxn], c[maxn],dp[maxn];/////w[i]表示骨头的体积,c[i]表示骨头的价值
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
memset(dp, 0, sizeof(dp));
int n, V;
scanf("%d%d", &n, &V);
for (int i = 1; i <= n; i++)
{
scanf("%d", &c[i]);
}
for (int i = 1; i <= n; i++)
{
scanf("%d", &w[i]);
}
for (int i = 1; i <= n; i++)
{
for (int v = V; v >= w[i]; v--)
dp[v] = max(dp[v], dp[v - w[i]] + c[i]);////状态转移方程
}
printf("%d\n", dp[V]);
}
return 0;
}