关闭

1291 快斗的烦恼

标签: 背包动态规划
428人阅读 评论(0) 收藏 举报
分类:
描述

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

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

输入

多组测试数据。

每组数据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 <iostream>
#include <cstring>
#include <fstream>
using namespace std;
int main()
{
	int value[1001],volumn[1001];//value、volumn分别保存珠宝的价值和体积
	long f[5001];//由于背包空间最大值为5000
	int n,m;//n代表珠宝数目,m代表背包体积
	ifstream cin("aaa.txt");
	while(cin>>n>>m&&n!=-1&&m!=-1)
	{
		memset(value,0,sizeof(value));
		memset(volumn,0,sizeof(volumn));
		memset(f,0,sizeof(f));
		for(int i=1;i<=n;i++)
		{
			cin>>value[i];
		}
		for(int i=1;i<=n;i++)
		{
			cin>>volumn[i];
		}
		for(int i=1;i<=n;i++)
		{
			for(int j=m;j>=0;j--)
			{
				if(j>=volumn[i]&&f[j]<f[j-volumn[i]]+value[i])
					f[j]=f[j-volumn[i]]+value[i];
			}
		}
		cout<<f[m]<<endl;
	}
	system("pause");
}


0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:131236次
    • 积分:2080
    • 等级:
    • 排名:第18311名
    • 原创:65篇
    • 转载:100篇
    • 译文:0篇
    • 评论:6条
    文章分类
    最新评论