hdu4341 Gold miner 分组背包dp

原创 2014年11月09日 16:26:07

题意:和黄金矿工差不多。。人在(0,0)。有n种金,游戏时间为T。告诉你每种金的位置(x,y),获得该金需要的时间的t,以及它的

价值。且若人和多块金子共线时,只能先取最近的金子。问在游戏时间内可获得最大价值。

思路:对于共线的金,我们将其分为一组,并按照距(0,0)的距离排序,那么选该点的价值为前面所有的价值,花费的时间也是前

面所有花费的时间。对于每组我们相当于只选一个,之后背包跑一下,详见代码:

// file name: hdu4341.cpp //
// author: kereo //
// create time:  2014年11月08日 星期六 17时42分41秒 //
//***********************************//
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<stack>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
const int sigma_size=26;
const int N=200+100;
const int MAXN=40000+100;
const double eps=1e-8;
const int inf=0x3fffffff;
const int mod=1000000000+7;
#define L(x) (x<<1)
#define R(x) (x<<1|1)
int n,T;
int dp[MAXN],res[MAXN],st[MAXN];
struct node{
	int x,y,t,val;
}p[N];
vector<int>G[N];
bool judge(node a,node b){
	return a.x*b.y == b.x*a.y;
}
bool cmp(int a,int b){
	return p[a].x*p[a].x+p[a].y*p[a].y<p[b].x*p[b].x+p[b].y*p[b].y;
}
int main()
{
	int kase=0;
	while(~scanf("%d%d",&n,&T)){
		for(int i=1;i<=n;i++)
			scanf("%d%d%d%d",&p[i].x,&p[i].y,&p[i].t,&p[i].val);
		int cnt=0;
		for(int i=1;i<=n;i++){
			int flag=1;
			for(int j=0;j<cnt;j++){
				if(!flag)
					break;
				if(judge(p[i],p[G[j][0]])){
					G[j].push_back(i);
					flag=0;
				}
			}
			if(!flag)
				continue;
			G[cnt].clear(); G[cnt++].push_back(i);
		}
		memset(dp,0,sizeof(dp));
		for(int i=0;i<cnt;i++){
			sort(G[i].begin(),G[i].end(),cmp);
			memcpy(res,dp,sizeof(dp));
			memcpy(st,dp,sizeof(dp));
			int val=0,t=0;
			for(int j=0;j<G[i].size();j++){
				int id=G[i][j];
				t+=p[id].t; val+=p[id].val;
				if(t>T)
					break;
				for(int k=T;k>=t;k--)
					if(res[k]<=res[k-t]+val)
						res[k]=res[k-t]+val;
				for(int k=t;k<=T;k++)
					dp[k]=max(dp[k],res[k]);
				memcpy(res,st,sizeof(st));
			}
		}
		printf("Case %d: %d\n",++kase,dp[T]);
	}
	return 0;
}


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:16
  • 319

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:44
  • 93

动态规划--分组背包--hdu4341 Gold miner

n块金子,T单位时间。 每块金子给出x,y坐标,得到需要的时间t,价值v。 在(0,0)位置取,共线的金子,必须按顺序,先取离原点近的。 可以整体排序,按斜率分组,在同一组里,按远近排序,计算前缀...
  • SM_545
  • SM_545
  • 2017-07-20 20:16:51
  • 77

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

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

HDU 4341 Gold miner (分组背包问题)

Gold miner Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To...
  • acbron
  • acbron
  • 2013-04-10 21:01:16
  • 305

hdu 4341 Gold miner(分组01背包)

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

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

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

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
收藏助手
不良信息举报
您举报文章:hdu4341 Gold miner 分组背包dp
举报原因:
原因补充:

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