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

hdu 2602 Bone Collector【01背包】

2013年02月14日 ⁄ 综合 ⁄ 共 2201字 ⁄ 字号 评论关闭

最经典、最基础的01背包入门题目

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602

Bone Collector

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 13839    Accepted Submission(s): 5454


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
 


Author
Teddy
 


Source
 


Recommend
lcy
 

很基础的背包入门题目,如果看了代码还不会做,就自己去百度文档中下载《背包九讲》吧。很强大的,注意有个事不要积分就可以下载的,看清楚了啊!

给几个下载地址:http://wenku.baidu.com/view/16527702de80d4d8d15a4f06.html

                               http://wenku.baidu.com/view/16527702de80d4d8d15a4f06.html

//hdu 2602 AC 0ms 248k

#include<stdio.h>
#include<string.h>
int main()
{
	int test;
	int n,v; 
	int i,j;
	int c[1005],w[1005],sum[1005];
	scanf("%d",&test);
	while(test--)
	{
		memset(sum,0,sizeof(sum));
		scanf("%d%d",&n,&v);
		for(i=0;i<n;i++)
			scanf("%d",&w[i]);//输入价值
		for(i=0;i<n;i++)
			scanf("%d",&c[i]);//输入对应的体积
		for(i=0;i<n;i++)
			for(j=v;j>=c[i];j--)
			{
				if(sum[j]<=(sum[j-c[i]]+w[i]))
					sum[j]=sum[j-c[i]]+w[i];
			}
		printf("%d\n",sum[v]);
	}
	return 0;
}

下面再贴个另外的代码,千万别提交啊,不是这道题目的。

/*
//注意下面的不要提交啊~~~ 
//不过貌似是另外一道题目的AC代码,具体是哪道题目我忘了。。。
//看了kb神的另外一篇完全背包博客后从新写的,如果改变测试数据输入的顺序就可如此AC,应该可以省下不少内存,虽然内存不要钱,但是能省则省了哈!O(∩_∩)O哈哈哈~大神果然强大 
#include<stdio.h>
#include<string.h>
int main()
{
	int test;
	int n,v;
	int i,j;
	int c,w,sum[1005];
	scanf("%d",&test);
	while(test--)
	{
		memset(sum,0,sizeof(sum));
		scanf("%d%d",&n,&v);
		while(n--)
		{
			scanf("%d%d",&w,&c);
			for(i=v;i>=c;i--)
			    if(sum[i]<=(sum[i-c]+w))
			       sum[i]=sum[i-c]+w;
		}
		printf("%d\n",sum[v]);
	}
	return 0;
}
*/

抱歉!评论已关闭.