题意:
k个块,给出每个块的高度hi,数量ci,不能超过的高度;
求这些块可以组成的最大高度一个。
思路:
大致可看这个题是一个背包,背包的承重是高度。
对于每个物品,有他的价值是高度,还有限定的数量,看到这里就是一个多重背包,
然后对于每个物品还有一个限制是对于他的特定高度,这种怎么处理其实很简单吧。
dp[]应该是一个存一个高度;
wa了一发,没有考虑一维的时候更新要从小到大。。所以按照特定高度升序一下就好了- -好菜啊
#include<cstdio>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=4e2+10;
struct asd{
int v;
int h;
int c;
};
bool cmp(asd x,asd y)
{
return x.h<y.h;
}
asd q[N];
int dp[N*100];
int n;
int main()
{
int n,W;
scanf("%d",&n);
W=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&q[i].v,&q[i].h,&q[i].c);
W=max(W,q[i].h);
}
sort(q+1,q+n+1,cmp);
memset(dp,0,sizeof(dp));
int ans=0;
int k,t;
for(int i=1;i<=n;i++)
{
k=1;
while(q[i].c-k>0)
{
t=k*q[i].v;
for(int j=q[i].h;j>=t;j--)
{
dp[j]=max(dp[j],dp[j-t]+t);
ans=max(ans,dp[j]);
}
q[i].c-=k;
k<<=1;
}
t=q[i].c*q[i].v;
for(int j=q[i].h;j>=t;j--)
{
dp[j]=max(dp[j],dp[j-t]+t);
ans=max(dp[j],ans);
}
}
printf("%d\n",ans);
return 0;
}