hdu 4341 Gold miner(分组01背包)

原创 2014年03月07日 20:24:39

http://acm.hdu.edu.cn/showproblem.php?pid=4341


看到这个图好亲切,黄金矿工,很好玩的游戏。。。

题意:矿工起初在(0,0)位置,有n种金矿,给出每种金矿的坐标,花费时间和价值。在同一条线上的金矿必须先抓近的再抓远的,若近的不抓没办法抓远的。要求在T时间内获得的最大价值。


思路:01背包问题,但需要变形。 变形之处就是解决在同一条线上的金矿。 分组背包,把在同一条线上的金矿分为同一组。先按斜率排序,斜率相等按距离排序。例如1,2,3,4,5,五种金矿,根据斜率计算出1和2;3和4斜率分别相等,那么可分为(1,2)(3,4)(5)三组。在这里由于先抓近的再抓远的,对于(3,4)一组,把3物品的时间和价值加到4物品上作为4物品的时间和价值。这样就对应了分组背包每组最多取一件。 形成分组背包模型后直接套模板。

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std;

int n,T;
struct node
{
	int x,y;
	int t,v;
	bool operator < (const struct node &tmp)const
	{

		if(y*tmp.x == x*tmp.y)//斜率相等,按距离从小到大排序,不能按y/x排,因为x可能为0.
			return y < tmp.y;
		return y*tmp.x < x*tmp.y;
	}
}point[210];

vector <struct node> edge[210];//保存分组后的状态
int cnt;
int dp[40010];

int solve()
{
	memset(dp,0,sizeof(dp));
	for(int i = 0; i <= cnt; i++)
	{
		for(int j = T; j >= edge[i][0].t; j--)
		{
			for(int k = 0; k < (int)edge[i].size(); k++)
				dp[j] = max(dp[j], dp[j-edge[i][k].t]+edge[i][k].v);
		}
	}
	return dp[T];
}

int main()
{
	int item = 1;
	while(~scanf("%d %d",&n,&T))
	{
		for(int i = 0; i < n; i++)
			scanf("%d %d %d %d",&point[i].x,&point[i].y,&point[i].t,&point[i].v);


		sort(point,point+n);

		for(int i = 0; i < n; i++)
			edge[i].clear();

		cnt = 0;
		edge[cnt].push_back(point[0]);

		for(int i = 1; i < n; i++)	//n件物品分组
		{
			if(point[i].x*point[i-1].y == point[i].y*point[i-1].x)
				edge[cnt].push_back(point[i]);
			else edge[++cnt].push_back(point[i]);
		}

		for(int i = 0; i <= cnt; i++)
		{
			//修改同一条线上的金矿的时间和价值
			for(int j = 1; j < (int)edge[i].size(); j++)
			{
				edge[i][j].t += edge[i][j-1].t;
				edge[i][j].v += edge[i][j-1].v;
			}
		}
		printf("Case %d: %d\n",item++,solve());
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 4341 分组背包

http://acm.hdu.edu.cn/showproblem.php?pid=4341 Problem Description Homelesser likes playing Gol...
  • u013573047
  • u013573047
  • 2015年02月05日 10:15
  • 568

HDU_01背包系列

HDU 01背包系列持续更新中……
  • jhgkjhg_ugtdk77
  • jhgkjhg_ugtdk77
  • 2016年07月22日 12:22
  • 2471

HDU4341:Gold miner(分组背包)

Gold miner Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total...
  • junior19
  • junior19
  • 2017年02月01日 00:50
  • 78

HDU4341——Gold miner(分组背包)

Gold miner Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot...
  • say_c_box
  • say_c_box
  • 2017年03月23日 10:18
  • 290

hdu 4341 分组背包

http://acm.hdu.edu.cn/showproblem.php?pid=4341 Problem Description Homelesser likes playing Gol...
  • u013573047
  • u013573047
  • 2015年02月05日 10:15
  • 568

分组背包及树上分组背包

【人生相关】好困啊QAQ 小伙伴们明天都去APIO了 当初脑残没报名= = 蛮后悔的= = 但想想2800rmb 也就还好了 美好的一天从一道树形dp开始 昨天看了下以前写的分组背包 树形dp ...
  • yxr0105
  • yxr0105
  • 2016年05月04日 09:52
  • 404

【背包专题】01背包

暑假集训开始了,按照队里的分配,我是弄DP的,嘛,于是我又一次的开始了从01背包开始学习,昨天将杭电的几道01背包重新做了一遍,下面讲讲我自己对于01背包的理解。   首先01背包题目的雏形是 有N件...
  • libin56842
  • libin56842
  • 2013年07月16日 09:53
  • 29314

hdu 4341(分组背包(好题))

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4341 分组背包问题, 由于一条直线上的要按照顺序取, 如果一条直线上有n个金矿, 对于这条直线则有n...
  • tjdrn
  • tjdrn
  • 2013年08月04日 21:40
  • 606

HDU2602/HDU1114/HDU2191(重新整理一下01背包,完全背包,多重背包)

好长时间不做背包的问题,有一点遗忘,现在把这些问题整理一下~ 一.01背包(HDU2602) 题目:http://acm.hdu.edu.cn/showproblem.php?pid=2602 题意就...
  • riba2534
  • riba2534
  • 2017年01月11日 13:24
  • 822

hdu1712 分组背包问题

问题 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量...
  • u013573047
  • u013573047
  • 2014年12月20日 15:25
  • 956
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 4341 Gold miner(分组01背包)
举报原因:
原因补充:

(最多只允许输入30个字)