zoukankan      html  css  js  c++  java
  • 背包模板

    背包模板,自己总结,做题可直接套用。


    0-1背包


    有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。


    公式:

    f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}

    伪代码:
    for i=1..N
        ZeroOnePack(c[i],w[i]);

    procedure ZeroOnePack(cost,weight)
        for v=V..cost    //注意要递减
            f[v]=max{f[v],f[v-cost]+weight}


    完全背包

    有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。


    公式:

    f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<=v}

    伪代码:
    for i=1..N
        CompletePack(c[i],w[i]);

    procedure CompletePack(cost,weight)
        for v=cost..V
            f[v]=max{f[v],f[v-c[i]]+w[i]}

    伪代码2:
    for i=1..N
        for v=0..V
            f[v]=max{f[v],f[v-cost]+weight}


    多重背包

    有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。


    公式:

    f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}

    伪代码:
    procedure MultiplePack(cost,weight,amount)
        if cost*amount>=V
            CompletePack(cost,weight)
            return
        integer k=1
        while k<amount
            ZeroOnePack(k*cost,k*weight)
            amount=amount-k
            k=k*2
        ZeroOnePack(amount*cost,amount*weight)


    混合三种背包问题

    有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。

    伪代码:
    for i=1..N
        if 第i件物品属于01背包
            ZeroOnePack(c[i],w[i])
        else if 第i件物品属于完全背包
            CompletePack(c[i],w[i])
        else if 第i件物品属于多重背包
            MultiplePack(c[i],w[i],n[i])


    二维费用的背包问题


    公式:

    f[i][v][u]=max{f[i-1][v][u],f[i-1][v-a[i]][u-b[i]]+w[i]}


    分组的背包问题


    公式:

    f[k][v]=max{f[k-1][v],f[k-1][v-c[i]]+w[i]|物品i属于组k}

    伪代码:
    for 所有的组k
        for v=V..0
            for 所有的i属于组k
                f[v]=max{f[v],f[v-c[i]]+w[i]}


    背包问题问法的变化

    输出方案


    伪代码:

    i=N
    v=V
    while(i>0)
        if(g[i][v]==0)
            print "未选第i项物品"
        else if(g[i][v]==1)
            print "选了第i项物品"
            v=v-c[i]


    求方案总数


    公式:

    f[i][v]=sum{f[i-1][v],f[i][v-c[i]]}


    最优方案的总数


    伪代码:

    for i=1..N
       for v=0..V
            f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
            g[i][v]=0
            if(f[i][v]==f[i-1][v])
                inc(g[i][v],g[i-1][v])
            if(f[i][v]==f[i-1][v-c[i]]+w[i])
                inc(g[i][v],g[i-1][v-c[i]])


    背包问题简单的深搜


    伪代码:

    procedure SearchPack(i,cur_v,cur_w)
        if(i>N)
            if(cur_w>best)
                best=cur_w
            return
        if(cur_v+v[i]<=V)
            SearchPack(i+1,cur_v+v[i],cur_w+w[i])
        SearchPack(i+1,cur_v,cur_w)




    注:

    参考资料:Tianyi Cui的背包九讲。




    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    DWZ中刷新dialog的方案解决
    C#开源资源
    css 布局
    js 事件
    css 1-3
    get post
    jquery ..... deferred
    arguments -- 仅仅是百度面试问了一下,大致就这些。不深
    git push
    [转载] ie 8 兼容性, 最重要的一点是,xp 最高支持ie8
  • 原文地址:https://www.cnblogs.com/wygdove/p/4814328.html
Copyright © 2011-2022 走看看