2165-黄金矿工 ZCMU

Description

 

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

3

7

HINT

30%的数据,0 < T ≤ 4000 

100%的数据,N ≤ 200, 0 < T ≤ 40000 

思路

背包题。关键是要解决黄金在同一条直线上的问题。采用结构存储数据,将黄金位置按斜率大小排序(相当于将在同一条直线上的黄金都放在一起)。

代码

#include<bits/stdc++.h>
#define MAX 500
using namespace std;
struct Gold{
  double k;
  int t,v,s;
}gold[MAX];
bool compare(Gold a,Gold b)
{
    if(a.k==b.k)
        return a.s<b.s;
    return a.k<b.k;
}
int main()
{
    int n,T,i,j,x,y;
    while(~scanf("%d%d",&n,&T))
    {
        for(i=1;i<=n;i++)
        {
           scanf("%d%d%d%d",&x,&y,&gold[i].t,&gold[i].v);
           gold[i].k=1.0*y/x;
           gold[i].s=x*x+y*y;
        }
        sort(gold+1,gold+n+1,compare);
        int dp[40005],time=0;
        memset(dp,0,sizeof(dp));
        for(i=1;i<=n;i++)
        {
            gold[i].k==gold[i-1].k?time+=gold[i].t:time=gold[i].t;
            for(j=T;j>=time;j--)
            {
                dp[j]=max(dp[j],dp[j-gold[i].t]+gold[i].v);
            }
        }
        printf("%d\n",dp[T]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ZCMU_2024/article/details/81317969