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;
}


Ningbo [1217] Dinner(简单题,但是注意输出,pe3遍)

1、http://cdn.ac.nbutoj.com/Problem/view.xhtml?id=1217 注意输出,中间有空格,最后没有,处理空格错了3遍 2、题目: [121...
  • sdjzping
  • sdjzping
  • 2014年02月15日 10:20
  • 1051

m序列,Gold序列,Walsh函数的区别

在码分多址通信系统中,存在着地址码的概念。地址码就是指能区分不同用户的码序列,地址码实际上也具有扩展频谱的作用。地址码的选择直接影响到CDMA系统的容量、抗干扰能力、接入和切换速度等性能。地址码应当具...
  • zhou1012099550
  • zhou1012099550
  • 2014年10月22日 11:01
  • 3653

RapidMiner数据挖掘入门之一:概要

1 简介 RapidMiner原名Yale,它是用于数据挖掘、机器学习、商业预测分析的开源计算环境。根据KDnuggets在2011年的一次投票显示,从使用率来看该软件比之R语言还要略胜一筹。因为其...
  • qiezikuaichuan
  • qiezikuaichuan
  • 2015年07月01日 18:02
  • 1991

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
  • 514

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

Gold miner Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot...
  • hnust_xiehonghao
  • hnust_xiehonghao
  • 2012年08月10日 23:29
  • 831

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
  • 280

HDU 4341 Gold miner(分组背包)

HDU 4341 Gold miner(分组背包) http://acm.hdu.edu.cn/showproblem.php?pid=4341 题意: 一个人在原点(0,0)抓金子,每...
  • u013480600
  • u013480600
  • 2014年10月31日 16:24
  • 1075

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

hdu4341 Gold miner 分组背包dp

题意: 思路:
  • u011645923
  • u011645923
  • 2014年11月09日 16:26
  • 508

hdu 4341 Gold miner(分组01背包)

http://acm.hdu.edu.cn/showproblem.php?pid=4341 看到这个图好亲切,黄金矿工,很好玩的游戏。。。 题意:矿工起初在(0,0)位置,有n种金矿,给出每种金...
  • u013081425
  • u013081425
  • 2014年03月07日 20:24
  • 1069
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 4341 Gold miner
举报原因:
原因补充:

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