hdu 4341 Gold miner

原创 2012年08月11日 13:26:59

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

//author:zhengjj.asd@gmail.com
//要取ai位置的黄金的话,必须把斜率一样,和原点的距离比ai近的点给全取了
//所以可以根据斜率进行分组,对每组中的第i个位置,把和原点的距离近的位置
//的价值和花费全部加到第i个位置的黄金上,这样取某个位置的黄金就代表把必须取的也取了
//这样就成了分组背包,主要就是这个转化

//ps:比赛的时候死活过不去,结果过两天一样的代码一字不动再交就过了,想不通,难道是比赛的数据是不同的?
//还是原来数据有错,后面改的?

//分组背包可以去看背包九讲..

#include <stdio.h>
#include <string.h>

int f[40010];

struct node{
	double k;
	int x, y;
	int value, cost;
};
node list[210][210];

inline int max(int a, int b)
{
	return a > b ? a : b;
}

int main()
{
	int cou[210];
	int n, t, tt = 0;
	while(~scanf("%d %d", &n, &t))
	{
		tt ++;
		int kk = 0;
		memset(list, 0, sizeof(list));
		memset(cou, 0, sizeof(cou));
		node in[201];
		for(int i = 0; i < n; ++ i)
		{
			scanf("%d %d %d %d", &in[i].x, &in[i].y, &in[i].cost, &in[i].value);
			in[i].k = in[i].x * 1.0 / in[i].y;
			if(in[i].k == 0)
				in[i].k = 3000;
		}
		for(int i = 0; i < n; ++i)
		{
			int x, y;
			x = in[i].x;
			y = in[i].y;
			double k = x * 1.0 / y;
			if(k == 0)
				k = 3000;
			int j = 0;
			while(j < kk && list[j][0].k != k)
				j ++;
			int value = 0, cost = 0;
			for(int q = 0; q < n; ++ q)
			{
				if(in[q].k == k && in[q].x * in[q].x + in[q].y * in[q].y <= x * x + y * y)
				{
					value += in[q].value;
					cost += in[q].cost;
				}
			}
			if(j == kk)
				kk ++;
			list[j][cou[j]].x = x;
			list[j][cou[j]].y = y;
			list[j][cou[j]].value = value;
			list[j][cou[j]].cost = cost;
			list[j][cou[j]].k = k;
			cou[j] ++;
		}
		memset(f, 0, sizeof(f));
		for(int j = 0; j < kk; ++ j)
		{
			for(int v = t; v >= 0; -- v)
			{
				for(int i = 0; i < cou[j]; ++ i)
				{
					if(v - list[j][i].cost >= 0 )
						f[v] = max(f[v], f[v - list[j][i].cost] + list[j][i].value);
				}
			}
		}
		printf("Case %d: %d\n", tt, f[t]);
	}
	return 0;
}


HDU 4341 Gold miner

题目链接 题意:一个人在原点(0,0)抓金子,n~200个金子,每块金子有一个获得需要的时间t和价值v。而且有的金子可能在一条直线上,那只能先抓近的,再抓远的。求在给定时间T~40000下,所能获得...
  • u013625492
  • u013625492
  • 2015-03-13 10:47:54
  • 262

hdu 4341 gold miner

受教了。这个题目是本人第一次做分组背包,比较失败。连题意带条件搞错了几个地方,最终悲剧的wa了4次。 #include #include #include using namespace std; ...
  • zhuyongqingacm
  • zhuyongqingacm
  • 2013-08-15 22:14:13
  • 568

HDU 4341 - Gold miner

B - Gold miner Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit...
  • leifjacky
  • leifjacky
  • 2016-04-26 17:01:23
  • 353

Hdu 4341 Gold miner

Gold miner Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot...
  • Magic____
  • Magic____
  • 2012-10-08 13:06:10
  • 418

HDU 4341 Gold miner (分组背包)

题意:一个人在原点(0,0)抓金子,每块金子有一个获得需要的时间t和价值v。而且有的金子可能在一条直线上,那只能先抓近的,再抓远的。求在给定时间T下,所能获得的最大价值。 这题可以转化为分组的...
  • u013491262
  • u013491262
  • 2014-03-12 22:45:56
  • 607

hdu acm 4341 Gold miner

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(...
  • hyf20144055065
  • hyf20144055065
  • 2015-10-02 11:58:16
  • 313

hdu 4341 Gold miner 分组背包

题意:矿工起初在(0,0)位置,有n种金矿,给出每种金矿的坐标,花费时间和价值。在同一条线上的金矿必须先抓近的再抓远的,若近的不抓没办法抓远的。要求在T时间内获得的最大价值。完全没有想到使用分组背包来...
  • Little_boy_z
  • Little_boy_z
  • 2018-02-09 18:31:41
  • 11

hdu 4341 Gold miner 分组背包

简单分组背包,同一斜率为一组。   #include #include #include #include #include using namespace std; double EP...
  • taozifish
  • taozifish
  • 2012-08-19 19:57:08
  • 285

hdu 4341 Gold miner (分组背包)

Problem Description Homelesser likes playing Gold miners in class. He has to pay much attention t...
  • hndu__lz
  • hndu__lz
  • 2017-02-06 19:34:29
  • 124

hdu 4341 Gold miner(分组背包)

Gold miner Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot...
  • caduca
  • caduca
  • 2014-09-11 17:55:45
  • 537
收藏助手
不良信息举报
您举报文章:hdu 4341 Gold miner
举报原因:
原因补充:

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