ZOJ3689 Digging(01背包)

#include <iostream>
#include <cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int dp[][];
struct point{
int t,s;
}ps[];
bool cmp(point A, point B)
{
return A.t*B.s < B.t*A.s;//比较大小的时候千万不要 计算出数值进行比较
}
int main(){
int n,t;
int i,j;
while(cin>>n>>t){
for(i=;i<n;i++)
{
cin>>ps[i].t>>ps[i].s;
}
sort(ps,ps+n,cmp);
memset(dp,,sizeof(dp));
int ma=-;
for(i=;i<=n;i++){
for(j=ps[i-].t;j<=t;j++){
dp[i%][j]=max(dp[(i-)%][j],dp[(i-)%][j-ps[i-].t]+ps[i-].s*(t-(j-ps[i-].t)));
if(i==n) ma=max(ma,dp[i%][j]);
}
}
/* for(int i = 0; i < n; i++)
for(int j = t; j >= ps[i].t; j--){
int index=0;
dp[index][j] = max(dp[index][j], dp[index][j-ps[i].t]+(t-j+ps[i].t)*ps[i].s);
if(i==n-1) ma=max(ma,dp[index][j]);
}*/
cout<<ma<<endl;
}
return ;
}
上一篇:java正则表达式语法详解及其使用代码实例


下一篇:BZOJ 1029: [JSOI2007]建筑抢修 优先队列