poj 2392 多重背包

题意:有几个砖,给出高度,能放的最大高度和数目,求这些砖能垒成的最大高度

依据lim排个序,按一层一层进行背包

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
const int maxn=;
int n,m,t;
int dp[maxn];
struct Node
{
int h,c;
int l;
void input()
{
scanf("%d%d%d",&h,&l,&c);
}
}node[maxn];
bool cmp(Node a,Node b)
{
return a.l<b.l;
}
//0-1背包,代价为cost,获得的价值为weight
void ZeroOnePack(int cost,int weight,int lim)
{
for(int i=lim;i>=cost;i--)
dp[i]=max(dp[i],dp[i-cost]+weight);
} //完全背包,代价为cost,获得的价值为weight
void CompletePack(int cost,int weight,int lim)
{
for(int i=cost;i<=lim;i++)
dp[i]=max(dp[i],dp[i-cost]+weight);
} //多重背包
void MultiplePack(int cost,int weight,int amount,int lim)
{
if(cost*amount>=lim) CompletePack(cost,weight,lim);
else
{
int k=;
while(k<amount)
{
ZeroOnePack(k*cost,k*weight,lim);
amount-=k;
k<<=;
}
ZeroOnePack(amount*cost,amount*weight,lim);//这个不要忘记了,经常掉了
}
}
int main()
{
int i,j,k;
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
while(scanf("%d",&n)!=EOF)
{
for(i=;i<n;i++) node[i].input();
sort(node,node+n,cmp);
memset(dp,,sizeof(dp));
for(i=;i<n;i++)
{
MultiplePack(node[i].h,node[i].h,node[i].c,node[i].l);
}
int maxh=node[n-].l;
int ans=;
for(i=;i<=maxh;i++)
{
ans=max(dp[i],ans);
}
printf("%d",ans);
}
return ;
}
上一篇:windows10安装gvim的_vimrc不生效的处理方法(xjl456852原创)


下一篇:Scala学习之路 (五)Scala的关键字Lazy