背包问题详解 (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]);
这个公式十分重要,如果理解了这个公式,那么背包问题就不难解