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

原创 2012年08月10日 23:29:50

Gold miner

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 705    Accepted Submission(s): 300


Problem Description
Homelesser likes playing Gold miners in class. He has to pay much attention to the teacher to avoid being noticed. So he always lose the game. After losing many times, he wants your help.

To make it easy, the gold becomes a point (with the area of 0). You are given each gold's position, the time spent to get this gold, and the value of this gold. Maybe some pieces of gold are co-line, you can only get these pieces in order. You can assume it can turn to any direction immediately.
Please help Homelesser get the maximum value.
 

Input
There are multiple cases.
In each case, the first line contains two integers N (the number of pieces of gold), T (the total time). (0<N≤200, 0≤T≤40000)
In each of the next N lines, there four integers x, y (the position of the gold), t (the time to get this gold), v (the value of this gold). (0≤|x|≤200, 0<y≤200,0<t≤200, 0≤v≤200)
 

Output
Print the case number and the maximum value for each test case.
 

Sample Input
3 10 1 1 1 1 2 2 2 2 1 3 15 9 3 10 1 1 13 1 2 2 2 2 1 3 4 7
 

Sample Output
Case 1: 3 Case 2: 7
 

Source
 

Recommend
zhuyuanchen520
题意:一个人在原点(0,0)抓金子,每块金子有一个获得需要的时间t和价值v。而且有的金子可能在一条直线上,那只能先抓近的,再抓远的。求在给定时间T下,所能获得的最大价值。
 
这题可以转化为分组的背包问题。分组的背包问题详解见背包九讲。
先将所有点按照斜率排序,斜率相同按照距离排序。
然后进行分组,将斜率相同的分进同一个组。
比如有5个点1,2,3,4,5,6.
1斜率小,2,3斜率相同,4,5,6斜率相同。那分三组(1),(2,3),(4,5,6)
然后在同一个组内需要处理下。比如(2,3)是先要抓2才能抓3的。那就把2,3的t和v加起来给3。这样2,3就只能取一个了,就变成分组的背包问题了。


#include <stdio.h>
#include <algorithm>
#include<math.h>
#include <string.h>
using namespace std;
struct st
{
    int x;
    int y;
    int v;
    int w;
}no[300],u[300][300];
int   cmp(const void *a,const void *b)
{
    double k1,k2;
    k1=(double)(*(struct st *)a).x/(*(struct st *)a).y;
    k2=(double)(*(struct st *)b).x/(*(struct st *)b).y;
    if(fabs(k1-k2)>0.000001) return k1>k2?1:-1;//先把斜率 按从小到大排列
	//    if(k1==k2) return k1>k2?1:-1;//先把斜率 按从小到大排列 注意对于浮点型的二级排序要特别注意 千万不要直接比较是否相等
    else return (*(struct st *)a).y>(*(struct st *)b).y?1:-1;//从小到大
}

int shu[300];
int dp[50009];
int mm=1;
int main()
{
    int i,j,m,n;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        for(i=0;i<m;i++)
        {
            scanf("%d%d%d%d",&no[i].x,&no[i].y,&no[i].w,&no[i].v);
        }
        //sort(no,no+m,cmp);
        qsort(no,m,sizeof(no[0]),cmp);
        int cos=0;
        memset(shu,0,sizeof(shu));
		
        for(i=0;i<m;i++)
        {
            u[cos][shu[cos]].x=no[i].x;
            u[cos][shu[cos]].y=no[i].y;
            u[cos][shu[cos]].w=no[i].w;
            u[cos][shu[cos]].v=no[i].v;
            shu[cos]++;
            if(i!=m-1)
            {
                while(i!=m-1&&(double)no[i+1].x/no[i+1].y==(double)no[i].x/no[i].y)
                {
                    u[cos][shu[cos]].x=no[i+1].x;
                    u[cos][shu[cos]].y=no[i+1].y;
                    u[cos][shu[cos]].w=u[cos][shu[cos]-1].w+no[i+1].w;
                    u[cos][shu[cos]].v=u[cos][shu[cos]-1].v+no[i+1].v;
                    shu[cos]++;
                    i++;
                }
                cos++;
            }
        }
		
		
        int k;
        memset(dp,0,sizeof(dp));
        for(i=0;i<=cos;i++)
        {
            for(j=n;j>=0;j--)
            {
                for(k=0;k<shu[i];k++)
                {
					//    if(j-u[i][k].w>=0&&dp[j]<dp[j-u[i][k].w]+u[i][k].v)
                    if(j-u[i][k].w>=0)
                        dp[j]=dp[j]>dp[j-u[i][k].w]+u[i][k].v?dp[j]:dp[j-u[i][k].w]+u[i][k].v;
                }
            }
        }
        printf("Case %d: ",mm++);
        printf("%d\n",dp[n]);
    }
    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
  • 290

hdu 4341 分组背包

http://acm.hdu.edu.cn/showproblem.php?pid=4341 Problem Description Homelesser likes playing Gol...
  • u013573047
  • u013573047
  • 2015年02月05日 10:15
  • 568

HDU_完全背包系列

HDU 完全背包系列持续更新中……
  • jhgkjhg_ugtdk77
  • jhgkjhg_ugtdk77
  • 2016年07月23日 12:01
  • 1300

hdu 4341(分组背包(好题))

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4341 分组背包问题, 由于一条直线上的要按照顺序取, 如果一条直线上有n个金矿, 对于这条直线则有n...
  • tjdrn
  • tjdrn
  • 2013年08月04日 21:40
  • 606

hdu1712 分组背包问题

问题 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量...
  • u013573047
  • u013573047
  • 2014年12月20日 15:25
  • 956

HDU2602/HDU1114/HDU2191(重新整理一下01背包,完全背包,多重背包)

好长时间不做背包的问题,有一点遗忘,现在把这些问题整理一下~ 一.01背包(HDU2602) 题目:http://acm.hdu.edu.cn/showproblem.php?pid=2602 题意就...
  • riba2534
  • riba2534
  • 2017年01月11日 13:24
  • 822

POJ 题目1837 Balance(分组背包)

Balance Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 11356   Accep...
  • yu_ch_sh
  • yu_ch_sh
  • 2015年03月26日 17:06
  • 485

HDU_01背包系列

HDU 01背包系列持续更新中……
  • jhgkjhg_ugtdk77
  • jhgkjhg_ugtdk77
  • 2016年07月22日 12:22
  • 2471

【背包专题】01背包

暑假集训开始了,按照队里的分配,我是弄DP的,嘛,于是我又一次的开始了从01背包开始学习,昨天将杭电的几道01背包重新做了一遍,下面讲讲我自己对于01背包的理解。   首先01背包题目的雏形是 有N件...
  • libin56842
  • libin56842
  • 2013年07月16日 09:53
  • 29314
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 4341 Gold miner 需要处理的分组背包 蛮有意义的题目
举报原因:
原因补充:

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