背包问题

作者: RobotBerry | 来源:发表于2017-04-24 14:36 被阅读54次

01背包

有一个背包,最大负重为W;有n块宝石,每件宝石的价值为vi,重量为wi,i为[1,n]。求背包能装下的宝石的最大价值。

典型的动态规划问题。状态表为dp[i][j],i为[0,n],表示宝石的下标;j为[0,W],表示递增的总负重。其状态转移方程为:

dp[i,j] = dp[i-1][j], j < w[i];
dp[i,j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]), j >= w[i].

note: dp被初始化为全0数组。

代码

for (int i = 1; i <= N; i++)
{
    for (int j = 1; j <= W; j++)
    {
        if (j < w[i])
            dp[i][j] = dp[i - 1][j];
        else
            dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
    }
}

由于状态转移方程只用到了相邻行的状态,因此可以把状态表缩减成一维dp[j]。此时的状态转移方程为:

dp[j] = max(dp[j], dp[j-w[i]] + v[i]), j >= w[i]

note: j从W递减为1

代码

for (int i = 1; i <= N; i++)
{
    for (int j = W; j >= w[i]; j--)
    {
        dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
    }
}

完全背包

有一个背包,最大负重为W;有n种宝石,每种宝石的价值为vi,重量为wi,i为[1,n]。宝石的数量无限。求背包能装下的宝石的最大价值。

状态表为dp[j],状态方程也是:

dp[j] = max(dp[j], dp[j-w[i]] + v[i]), j >= w[i]

但是j是从1递增至W,和上面的01背包相反。原因在于每种的宝石的数量都是无限的,是在解决当前问题(i种物品),向有i种物品的背包添加第i种物品;而01背包问题是在解决当前问题(i种物品),向有i-1种物品的背包添加第i种物品。

代码

for (int i = 1; i <= N; i++)
{
    for (int j = w[i]; j <= W; j++)
    {
        dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
    }
}

多维背包

有一个背包,最多能被Wa克a物质和Wb克b物质;有n种宝石,每种宝石的价值为vi,所含ab物质的质量分别为wai克和wbi克。求背包能装下的宝石的最大价值。

状态表为dp[j][k],状态方程为:

dp[j][k]=max(dp[j][k], dp[[j-wa[i]][[k-wb[i]] + vi)

for (int i = 1; i <= N; i++)
{
    for (int j = Wa; j >= wa[i]; j--)
    {
        for (int k = Wb; k >= wb[i]; k--)
        {
            dp[j][k] = max(dp[j][k], dp[j - wa[i]][k - wb[i]] + v[i]);
        }
    }
}

可以扩展至任意维。

for (int i = 1; i <= N; i++)
{
    for (int j = Wj; j >= wj[i]; j--)
    {
        for (int k = Wk; k >= wk[i]; k--)
        {
            for (int l = Wl; l >= wl[i]; l--)
            {
                ...
                    dp[j][k][l]... = max(dp[j][k][l]..., dp[j - wj[i]][k - wk[i]][l - wl[i]]... + v[i]);
            }
        }
    }
}

相关文章

  • 背包问题(完全背包)

    动态规划合集: 1.矩阵链乘法2.投资组合问题3.完全背包问题4.01背包问题5.最长公共子序列 例题3——背包问...

  • Algorithm进阶计划 -- 动态规划(下)

    经典动态规划背包问题最长子序列问题 1. 背包问题 1.1 0-1 背包问题 0-1 背包问题,描述如下: 上面...

  • 背包问题

    0-1背包问题 问题 n个物体,它们各自有重量和价值,给定一个有容量的背包,如何让背包里装入的物体价值总和最大? ...

  • 背包问题

    问题描述 假如有一个能装下4磅的背包,如何从下列商品列表中选择商品填充背包,使价值达到最大: 动态规划 要解决背包...

  • 背包问题

    (1)0-1背包容量为10的背包,有5种物品,每种物品只有一个,其重量分别为5,4,3,2,1,其价值分别为1,2...

  • 背包问题

  • 背包问题

    01背包(物品只有一个) 有N件物品和一个容量为V的背包。第i建物品的费用是w[i],价值是v[i]。求解将哪些物...

  • 背包问题

    1. 01背包 状态说明:背包体积为v,物品个数为n,f[n,v]表示前n件物品加入背包的最大价值。c_i,w_i...

  • 背包问题

    01背包 优化空间复杂度,变为一维; 外循环依然是n从1->N, 注意内循环 v是从V->0,为什么内循环是V->...

  • 背包问题

    介绍 学习动态规划算法的经典例题。动态规划算法一般有3个特征1、最优化原理:最优解所包含的子问题的解也是最优的。2...

网友评论

    本文标题:背包问题

    本文链接:https://www.haomeiwen.com/subject/kafpzttx.html