POJ 2392【多重背包】

题意:
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
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934851.html