背包问题详解

本文详细介绍了背包问题,包括0-1背包、多重背包和无限背包,并提供了多种使用递归和循环解决的Java代码实现,重点讲解了动态规划的思路和关键公式。还探讨了如何在记录选择的物品上进行优化。
摘要由CSDN通过智能技术生成

背包问题详解 (java)


拿着一个容量为C(重量)的背包,去杂货店买东西,第i件物品的价值是v[i],重量是w[i]。问在不超过背包容量C的情况下,最多能买多少钱的东西.

背包问题可以大致分为:

0-1背包问题:

商店里的每个物品能且仅能购买一次.

多重背包问题:

商店里的每样东西都可以购买N次。

无限背包问题:

商店里的每样东西都可以无限次的购买


其实,只要把0-1背包问题的思想掌握,其他两种背包问题也能通过类似的思路去解决。本篇会详细的介绍0-1背包问题,并给出用递归,二维数组,一维数组。实现的代码


其实对于背包中的每一件物品i,无非就是放进去或者不放进去。那物品i是不是要放进去呢?那就取决于放进去以后,同等容量下,价值是不是更大了。
用c表示价值,用i表示第i件物品。F[i][c]表示容积为c的时候,放进前i件商品,能获得的最大价值。
注意 i 代表的就是第i件物品

用公式表示就是:

F(i,c) = Math.max(F(i-1,c),F(i-1,c-w[i])+v[i]);

这个公式十分重要,如果理解了这个公式,那么背包问题就不难解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值