您的位置:首页 > 其它

zoj 3689 简单背包

2013-04-20 16:31 387 查看
题意:古代某统治者要修建一些棺材,其中第 i 个棺材大小为 s[i],修建需要花费 t[i] 天,如果在剩余 x 天的时候开始修建并且能够及时完成,则能获得 x * s[i] 的报酬,总共有 T 天可用,问最大能获得的报酬为多少

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cstring>
using namespace std;
int dp[10002];
struct node
{
int t,s;
double ae;
} aa[3005];
int cmp(struct node s,struct node t)
{
if(s.ae!=t.ae)
return s.ae>t.ae;
return s.s>t.s;
}
int main()
{
int n,T,i,j;
while(scanf("%d%d",&n,&T)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d%d",&aa[i].t,&aa[i].s);
aa[i].ae=(aa[i].s*1.0)/(aa[i].t*1.0);
}
sort(aa,aa+n,cmp);
int sum=0;
memset(dp,0,sizeof(dp));
int ans=0;
for(i=0;i<n;i++)
{
for(j=T;j>=aa[i].t;j--)
{
if(j-aa[i].t==0||dp[j-aa[i].t])
{
dp[j]=max(dp[j],dp[j-aa[i].t]+(T-j+aa[i].t)*aa[i].s);
}
ans=max(ans,dp[j]);
}  //cout<<ans<<endl;
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: