1291 快斗的烦恼

 
描述

话说黑羽快斗(大家都知道吧)又一次成功潜入了某个博物馆,而眼前宝石的数量之多也是他事先未料到的。面对着数量如此多的珠宝,快斗在叹息自己带的背包太小之余,也在烦恼着该如何带走最大价值的宝石。

快斗很快就把宝石收集到了一起,对于每一枚宝石,快斗给出了它的价值。然而,并不是价值高的宝石就应该带走。由于有的宝石虽然价值很高,但是因为体积太大而占用了太多背包的位置。 而快斗希望他带走的宝石的总价值最大。这就要对宝石进行一些取舍。
由于宝石的数量过于巨大,即使以快斗的高智商也不能在很短的时间解决。好在快斗本身也是一个程序员,他决定用计算机帮助他计算他能带走的宝石的最大价值。

输入

多组测试数据。

每组数据3行:

第一行2个整数 n (0 <= n <=1000 ), w (0 <= w <=5000 )。表示宝石个数和背包空间。
第二行n个整数vi (i=1,2,……n),表示第i个宝石的价值。(0<= vi <=10000)
第三行n个整数ti (i=1,2,……n),表示第i个宝石的体积。(1<= ti <= w)

数据以-1 -1结束,不必输出结果。

输出

对每一组数据输出一个整数,即能够带走的最大价值。

样例输入
4 8
2 3 4 5
2 3 4 5
-1 -1
样例输出
8

 

 

典型的背包问题,动态规划

 

#include <stdio.h>

int main()
{
	int n,w,i,j,value[1001],volumn[1001];
	long f[5001];
	scanf("%d %d",&n,&w);
	while(n != -1 && w != -1)
	{
		for(i=0;i<1002;i++)
		{
			value[i]=volumn[i]=0;
		}
		for(i=1;i<=n;i++)
			scanf("%d",&value[i]);
		for(i=1;i<=n;i++)
		    scanf("%d",&volumn[i]);
		
		for(i=0;i<5001;i++)
			f[i]=0;
		
		for(i=1;i<=n;i++)
		{
			for(j=w;j>=0;j--)
			{
				
				if(j>=volumn[i] && f[j]<f[j-volumn[i]]+value[i])
					f[j]=f[j-volumn[i]]+value[i];				
				
			}
		}
	
		printf("%ld\n",f[w]);
		
		scanf("%d %d",&n,&w);
	}
	
	return 0;
}


 

 

你可能感兴趣的:(测试)