• 洛谷P1782 旅行商的背包[多重背包]


    题目描述

    小S坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商。在出发之前,他购进了一些物品。这些物品共有n种,第i种体积为Vi,价值为Wi,共有Di件。他的背包体积是C。怎样装才能获得尽量多的收益呢?作为一名大神犇,他轻而易举的解决了这个问题。

    然而,就在他出发前,他又收到了一批奇货。这些货共有m件,第i件的价值Yi与分配的体积Xi之间的关系为:Yi=ai*Xi^2+bi*Xi+ci。这是件好事,但小S却不知道怎么处理了,于是他找到了一位超级神犇(也就是你),请你帮他解决这个问题。

    输入输出格式

    输入格式:

    第一行三个数n,m,C,如题中所述;

    以下n行,每行有三个数Vi,Wi,Di,如题中所述;

    以下m行,每行有三个数ai,bi,ci,如题中所述。

    输出格式:

    仅一行,为最大的价值。

    输入输出样例

    输入样例#1:
    2 1 10
    1 2 3
    3 4 1
    -1 8 -16
    输出样例#1:
    10

    说明

    【数据范围】

    对于100%的数据,1≤n≤10,000,1≤m≤5,1≤C≤10000,

    1≤Wi,Vi,Di≤1000,-1000≤ai,bi,ci≤1000.

    【样例解释】

    前两种物品全部选走,最后一个奇货分给4的体积,收益为2*3+4*1+-1*16+8*4+-16=10。

    时限3s


    多重背包 二进制拆分

    m很小,爆枚即可

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    const int N=1e4+5,INF=1e9;
    int read(){
        char c=getchar();int x=0,f=1;
        while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}
        return x*f;
    }
    int n,v,w,c,C,m,a,b;
    int f[N];
    inline void zp(int v,int w){
        for(int j=C;j>=v;j--) f[j]=max(f[j],f[j-v]+w);
    }
    inline void cp(int v,int w){
        for(int j=v;j<=C;j++) f[j]=max(f[j],f[j-v]+w);
    }
    inline void mp(int v,int w,int c){
        if(c*v>C){cp(v,w);return;}
        int k=1;
        while(k<c){
            zp(v*k,w*k);
            c-=k;
            k*=2;
        }
        zp(v*c,w*c);
    }
    int main(){
        n=read();m=read();C=read();
        for(int i=1;i<=n;i++){
            v=read();w=read();c=read();
            mp(v,w,c);
        }
        for(int i=1;i<=m;i++){
            a=read(),b=read(),c=read();
            for(int j=C;j>=0;j--)
                for(int k=0;k<=j;k++) f[j]=max(f[j],f[j-k]+(a*k+b)*k+c);
        }
        printf("%d",f[C]);
    }
  • 相关阅读:
    string subscript out of range
    基数树(radix tree)
    改进版的快速排序
    快速排序算法-C语言实现
    归并排序
    用数组名做函数参数(转)
    堆和栈的区别
    给指针malloc分配空间后就等于数组吗?
    codeblocks中添加-std=c99
    堆排序-C语言实现
  • 原文地址:https://www.cnblogs.com/candy99/p/6075508.html
Copyright © 2020-2023  润新知