总结: 0-1背包问题  --> 动态规划d…

本文探讨了背包问题的两种动态规划解决方案。一种是从上至下的递归方式,另一种是从下至上的迭代方式。通过具体的状态转移方程,详细解释了如何在不超过背包容量的情况下使物品的总重量最大化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                              动态规划

(参照刘汝佳代码)

1.   有n种物品,每种只有一个.第i种物品的体积是Vi , 重量为Wj , 选一些物品装到一个容量为C的背包,

      使得背包里面的物品不超过总体积C的前提下重量尽可能的大.

       1<=n<=100, 1<=Vi<=C<=10000,1<=Wi<=10^6

解法1:

状态方程: d(i,j) = max( d(i+1,j) , d(i+1,j-v[i]) + w[j] );   (i > n 时,d(i,j) = 0.)

                 d(i,j)表示 当前第i层,背包剩余容量为j时接下来的最大重量和.

代码: d[1][c]为结果

for(int i = n; i >= 1; --i)
{
    for(int j = 0; j <= c; ++j)
    {
        d[i][j] = (i == n ? 0 : d[i+1][j]);
        if(j >= v[i])
        {
            if(d[i][j] <= d[i+1][j-v[i]]+w[i])
                d[i][j] = d[i+1][j-v[i]]+w[i];
        }
    }
}


解法2: 相反的规划方向.

采用对称的状态. 设f(i,j) 表示把前i个物品装到容量为j的最大总重量.

状态方程: f(i,j) = max( f(i-1,j) , f(i-1,j-v[i])+w[i] );

    i == 0 时为0 ,  j < 0时负无穷. 结果为f(n,c);

代码:

for(int i =1 ; i <= n; ++i)
{
    for(int j = 0; j <= c; ++j)
    {
        f[i][j] = (i == 1 ? 0 : f[i-1][j]);
        if(j >= v[i])
        {
            if(f[i][j] <= f[i-1][j-v[i]]+w[i])
                f[i][j] = f[i-1][j-v[i]]+w[i];
        }
    }
}


总结: 尽管在很多情况下,记忆化(剪枝)搜索程序直观,易懂. 但是计算顺序如果变得重要时

        明显是递推时比较方便.效率相应高些. 同时规划的方向也是不唯一的看个人思维方向.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值