ボーンコレクターの
問題の説明
何年も前、テディの出身地に「ボーンコレクター」と呼ばれる男性がいました。この男は犬、牛などのさまざまな骨を収集するのが好きです。
また、彼は墓に行きました… 骨のコレクターは、Vのボリュームの大きなバッグを持っていました。収集の旅に沿って、明らかにたくさんの骨があります。異なるボーンには異なる値と異なるボリュームがあり、旅行に沿った各ボーンの値を指定すると、ボーンコレクターが取得できる合計値の最大値を計算できますか?
入力
最初の行には、ケースの数である整数Tが含まれます。
Tケースが続き、各ケースは3行です。最初の行には、骨の数とバッグの容量を表す2つの整数N、V(N <= 1000、V <= 1000)が含まれています。2行目には、各ボーンの値を表すN個の整数が含まれています。3行目には、各ボーンのボリュームを表すN個の整数が含まれています。
出力
合計値の最大値を表す1行あたり1つの整数(この数値は231未満になります)。
サンプル入力
1 5
10 1 2 3 4 5 5 4 3 2 1
出力例
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;
}