ボーンコレクターHDU-2602(01バックパック問題解決レポート)

ボーンコレクターの
問題の説明
何年も前、テディの出身地に「ボーンコレクター」と呼ばれる男性がいました。この男は犬、牛などのさまざまな骨を収集するのが好きです。
また、彼は墓に行きました… 骨のコレクターは、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;
}
元の記事を7件公開しました 賞賛されました0 訪問67

おすすめ

転載: blog.csdn.net/weixin_45629285/article/details/105589138