标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 40404 Accepted Submission(s): 16786
1 5 10 1 2 3 4 5 5 4 3 2 1
14
//hdu 2602 Bone Collector
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define max(a,b) (a>b?a:b)
using namespace std;
struct inin
{
int val;//价值!
int cos;//体积!
}boy[10001];
int bag[10001];//下表的大小个数个物品总价值!
int main()
{
int T;
int n,v;//n代表背包的个数,v代表背包的总体积!
scanf("%d",&T);
while(T--)
{
memset(boy,0,sizeof(boy));//保存某个物品的价值和体积!
memset(bag,0,sizeof(bag));//保存i个物品的总价值!
scanf("%d%d",&n,&v);//n代表背包的个数,v代表背包的总体积!
for(int i=1;i<=n;i++)
{
scanf("%d",&boy[i].val);//价值
}
for(int j=1;j<=n;j++)
{
scanf("%d",&boy[j].cos);//体积
}
for(int i=1;i<=n;i++)
{
for(int j=v;j>=boy[i].cos;j--)//从后向前求背包能装的最大的价值
{
bag[j]=max(bag[j],bag[j-boy[i].cos]+boy[i].val);//看放与不放第i件物品他的价值哪个大,选价值较大的放进数组bag里面
}//放的意思不是在目前放的最大的体积的基础上放与不放,而是在你目前的体积减去你将要放的那个背包的体积所得到的体积所能容纳的最大的价值的基础上才放的!
}
printf("%d\n",bag[v]);//最终遍历完所有的物品之后最后一个最大的价值就是所求!
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
hdu 2602 Bone Collector 【01背包模板】
标签:
原文地址:http://blog.csdn.net/dxx_111/article/details/48029813