#include<stdio.h>
#include<string.h>
#include<stack>
#include<string>
#include<math.h>
#include<queue>
#include<set>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
using namespace std;
#define LL long long
#define inf 1<<31
#define mod 1000000007
#define N 40100
int dp[N];
struct node
{
int x,y,z;
}a[N],b[N];
bool cmp(node c,node d)
{
return c.y<d.y;
}
int main()
{
int i,j,n,m=0;
scanf("%d",&n);
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
m=max(m,a[i].y);
}
int tot=0;
for(i=1;i<=n;i++)//多重背包转化为01背包
{
int k=1;
while(a[i].z>=k)
{
b[++tot].x=a[i].x*k;
b[tot].y=a[i].y;
a[i].z-=k;
k<<=1;
}
if(a[i].z)
{
b[++tot].x=a[i].x*a[i].z;
b[tot].y=a[i].y;
}
}
sort(b+1,b+1+tot,cmp);
for(i=1;i<=tot;i++)
{
for(j=b[i].y;j>=b[i].x;j--)
dp[j]=max(dp[j],dp[j-b[i].x]+b[i].x);
}
int ans=0;
for(i=m;i>=0;i--)
ans=max(ans,dp[i]);
printf("%d\n",ans);
return 0;
}
POJ 2392 Space Elevator
最新推荐文章于 2023-07-24 07:41:48 发布