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) 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
  • 291

hdu4341(分组背包)

链接:点击打开链接 题意:模拟黄金矿工,给出每个金子的位置和所需时间,计算在给定时间内最大收益,如果在同一条直线上必须先抓近的才能够抓远的 代码:#include #include #includ...
  • stay_accept
  • stay_accept
  • 2016年07月18日 11:58
  • 164

hdu4341(分组背包)

Gold miner Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total...
  • xj2419174554
  • xj2419174554
  • 2013年08月04日 20:10
  • 584

【DP算法篇之初学】背包问题

昨天做了爱奇艺的内推笔试,编程题又出现了动态规划问题,感觉动态规划出现的概率好大,需要加强下。这里借用背包问题开始我们的学习。 背包问题的经典讲解可以参见背包问题九讲,此外我在刷题的过程中发现还发...
  • woxiaohahaa
  • woxiaohahaa
  • 2016年08月31日 10:13
  • 3596

完全背包(经典dp)

完全背包 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 直接说题意,完全背包定义有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的体积是c,价...
  • usher_ou
  • usher_ou
  • 2017年03月24日 21:23
  • 146

完全背包问题讲解(dp)

此题之前先分析两种常见的背包问题,01背包与完全背包 01背包:在M件物品中取出若干件物品放到背包中,每件物品对应的体积v1,v2,v3,....对应的价值为w1,w2,w3,,,,,每件物品之多拿...
  • Yumerina
  • Yumerina
  • 2017年02月14日 14:42
  • 1158

01背包问题讲解(dp)

给大家附上一个题目吧,便于理解 ctest有n个苹果,要将它放入容量为v的背包。给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值。 输入:每组测试数据第一行为2个正整数,分别代表苹...
  • Yumerina
  • Yumerina
  • 2017年02月12日 13:53
  • 276

分组背包及树上分组背包

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

HHOJ 多重部分和问题(分组背包问题)

1149: 多重部分和问题 时间限制: 1 Sec  内存限制: 128 MB 提交: 160  解决: 88 题目描述 有n中不同大小的数字ai,每种各mi个。判断是否可以从这些数字之中选出若干...
  • huihui1094667985
  • huihui1094667985
  • 2016年08月06日 09:20
  • 192
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu4341 Gold miner 分组背包dp
举报原因:
原因补充:

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