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(分组背包)

Gold miner Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot...
  • caduca
  • caduca
  • 2014年09月11日 17:55
  • 488

hdu 4341 Gold miner 需要处理的分组背包 蛮有意义的题目

Gold miner Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot...

hdu acm 4341 Gold miner

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(...

HDU 4341 Gold miner(分组背包)

HDU 4341 Gold miner(分组背包) http://acm.hdu.edu.cn/showproblem.php?pid=4341 题意: 一个人在原点(0,0)抓金子,每...

hdu4341 Gold miner 分组背包dp

题意: 思路:

HDU4341——Gold miner(分组背包)

Gold miner Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot...

hdu 4341 Gold miner(分组01背包)

http://acm.hdu.edu.cn/showproblem.php?pid=4341 看到这个图好亲切,黄金矿工,很好玩的游戏。。。 题意:矿工起初在(0,0)位置,有n种金矿,给出每种金...

Hdu 4341 Gold miner

Gold miner Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot...

1003_Gold_miner

题目: hdu_4341_Gold_miner 官方题解: 显然,必须先拿走前面的金子才能拿后边的,所以排序处理共线情况。然后进行背包即可 个人理解: 有两种方法处理共线情况...

HDU4341

#include #include #include #include #include #include #include #include #include #include #include ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 4341 Gold miner
举报原因:
原因补充:

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