zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    oracle课堂笔记---第十九天
    oracle课堂笔记--第十八天
    oracle课堂随笔--第十七天
    oracle课堂随笔--第十六天
    oracle课堂随笔--第十五天
    oracle课堂随笔--第十四天
    oracle课堂笔记--第十三天
    oracle课堂随笔--第十一天
    Beta冲刺预备
    个人作业——软件产品分析
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934851.html
Copyright © 2011-2022 走看看