2165-黄金矿工 ZCMU
程序员文章站
2022-06-06 17:45:43
...
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;
}