现在的位置: 首页 > 综合 > 正文

hdu 2062 Bone Collector — 01背包模板

2017年10月03日 ⁄ 综合 ⁄ 共 576字 ⁄ 字号 评论关闭
/**
*  01背包:
*      有 N 件物品和一个容量为 V 的背包。放入第 i 件物品耗费的费用是 Ci,得到的 价值是 Wi。
*      求解将哪些物品装入背包可使价值总和最大。 
*  伪码:
*      F[0..V ]←0 for i ← 1 to N 
*      for v ← V to Ci
*      F[v] ←max{F[v],F[v−Ci] + Wi}
*  
*/
#include <stdio.h>
#include <string.h>
#define maxn 1005
int max(int a, int b){
	if (a > b)return a;
	return b;
}
int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		int n, V;
		int v[maxn], w[maxn], dp[maxn];
		memset(dp, 0, sizeof(dp));
		scanf("%d%d", &n, &V);
		for (int i = 1; i <= n; i++)
			scanf("%d", &w[i]);
		for (int i = 1; i <= n; i++)
			scanf("%d", &v[i]);
		for (int i = 1; i <= n; i++)
		for (int vo = V; vo >= v[i]; vo--){ //枚举所有可以装入i石块的情况
			dp[vo] = max(dp[vo], dp[vo - v[i]] + w[i]);
		}
		printf("%d\n", dp[V]);
	}
	return 0;
}
/*
1
5 10
1 2 3 4 5
5 4 3 2 1
**
14
*/

抱歉!评论已关闭.