背包问题总结【01,恰好/不超过,完全,多重,路径记录,应用】

本文详细介绍了背包问题的四种类型:01背包、恰好装满时的背包、完全背包问题和多重背包问题,包括各自的解题思路和状态转移方程。对于01背包和完全背包,关键在于遍历顺序的不同,而对于多重背包,可以通过拆分物品来转换为01背包问题。此外,文章还讨论了如何记录所选路径以及各类背包问题的初始化和边界条件。
摘要由CSDN通过智能技术生成

有N件物品和一个容量为V的背包。第i件物品的体积是w[i],价值是v[i]。

1.0-1 背包

求解将哪些物品装入背包可使价值总和最大,每种物品至多只能选择一件

dp[i][j]表示第i件物品放入容量为j的背包所得的最大价值

dp[i][j]=max{dp[i-1][j-w[i]]+v[i] , dp[i-1][j]};

这里我们从j=V倒推回来的话可以优化成

dp[j]=max{dp[j] , dp[j-w[i]]+v[i]};

核心代码:

fori=0;i<=V;i++){
    dp[i] = 0;//初始化均为0
}
fori=1;i<=n;i++){
    for(j=V;j>=w[i];j--){//倒序更新,对于重量w[i]小于j的不作更新
        //choice[i][j] = true;//如需记录,则可另创一个辅助数组(详见下文)
        dp[j]=max{dp[j],dp[j-w[i]]+v[i]};
    }
}

dp[V]即为最大的价值


2.恰好装满时

此时只需改变初始值,即

#define INF 0x7fffffff
for(i=1;i<=V;i++)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值