zoukankan      html  css  js  c++  java
  • 3269 混合背包

    3269 混合背包

     

     时间限制: 1 s
     空间限制: 256000 KB
     题目等级 : 钻石 Diamond
     
     
     
    题目描述 Description

    背包体积为V ,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至多取1件,要么至多取mi件(mi > 1) , 要么数量无限 , 在所装物品总体积不超过V的前提下所装物品的价值的和的最大值是多少?

    输入描述 Input Description

    第一行两个数N,V,下面N行每行三个数Vi,Wi,Mi表示每个物品的体积,价值与数量,Mi=1表示至多取一件,Mi>1表示至多取Mi件,Mi=-1表示数量无限

    输出描述 Output Description

    1个数Ans表示所装物品价值的最大值

    样例输入 Sample Input

    2 10

    3 7 2

    2 4 -1

    样例输出 Sample Output

    22

    数据范围及提示 Data Size & Hint

    对于100%的数据,V <= 200000 , N <= 200

    分类标签 Tags 点此展开 

     
     
    背包dp例题(二进制拆分),复习一下,so仅贴AC代码 
    AC代码:
    #include<bits/stdc++.h>
    using namespace std;
    #define N 300010
    int v[N],c[N],e[N],f[N];
    int n,m,n1;
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=0;i<=22;i++) e[i]=1<<i;
        for(int i=1,x,y,s;i<=n;i++){
            scanf("%d%d%d",&x,&y,&s);
            int t=0;
            if(s==-1) s=m/x;
            while(s>=e[t]){
                v[++n1]=x*e[t];
                c[n1]=y*e[t];
                s-=e[t++];
            }
            if(s>0){
                v[++n1]=x*s;
                c[n1]=y*s;
            }
        }
        for(int i=1;i<=n1;i++){
            for(int j=m;j>=v[i];j--){
                f[j]=max(f[j],f[j-v[i]]+c[i]);
            }
        }
        printf("%d
    ",f[m]);
        return 0;
    }
     
  • 相关阅读:
    C#正则表达式
    HDU 1009 FatMouse' Trade
    HDU 1022 Train Problem I
    HDU 3665 Seaside
    (转)qsort完整版用法
    HDU 1061 Rightmost Digit (矩阵快速幂)
    HDU 2817 A sequence of numbers
    HDU 1943 Ball bearings
    HDU 1058 Humble Numbers
    HDU 4278 Faulty Odometer
  • 原文地址:https://www.cnblogs.com/shenben/p/5778517.html
Copyright © 2011-2022 走看看