HDU 2602: Bone Collector
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description
Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave …
The bone collector had a big bag with a volume of V ,and along his trip of collecting there are a lot of bones , obviously , different bone has different value and different volume, now given the each bone’s value along his trip , can you calculate out the maximum of the total value the bone collector can get ?
Input
The first line contain a integer T , the number of cases.
Followed by T cases , each case three lines , the first line contain two integer N , V, (N <= 1000 , V <= 1000 )representing the number of bones and the volume of his bag. And the second line contain N integers representing the value of each bone. The third line contain N integers representing the volume of each bone.
Output
One integer per line representing the maximum of the total value (this number will be less than 231).
Sample Input
1 5 10 1 2 3 4 5 5 4 3 2 1
Sample Output
14
题意
有个逗比喜欢收集骨头,给出case数,背包体积,骨头数据后问能装得的最大价值
思路
每种骨头都只有一个,为01背包模板题,没有其他判断,数据也不大。学习01背包之后作为自己的练习。
不知为什么G++提交WA,C++提交AC......什么操作
AC代码
#include <iostream>
#include<cstdio>
using namespace std;
struct info
{
int v;
int w;
}bone[1005];
int dp[1005];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int N, V, i;
scanf("%d%d", &N, &V);
for (i = 1; i <= N; i++)
{
scanf("%d", &bone[i].v);
}
for (i = 1; i <= N; i++)
{
scanf("%d", &bone[i].w);
}
//01背包打表
memset(dp, 0, sizeof(int) * 1005);
for (i = 1; i <= N; i++)
{
//对背包空间的遍历需要反着进行
for (int j = V; j >= bone[i].w; j--)
{
//如果放入
if (dp[j] < bone[i].v + dp[j - bone[i].w])
{
dp[j] = bone[i].v + dp[j - bone[i].w];
//错写为dp[j] = bone[i].v + dp[j];导致打表错误
}
}
}
printf("%d\n", dp[V]);
}
return 0;
}