背包问题 没有进行空间优化的java代码

 dp

 1、当背包只能承重1的时候,检查每种物品能否放进去,放进去能否得到最大value。

2、当背包只能承重2的时候,检查每种物品能否放进去,放进去能否得到最大value。这里,当承重为2的时候,放物品需要有两种考虑。

一:如果所检查的物品比承重2大的话,这种物品是不用考虑的。

二:如果所检查的物品比承重2小,那么也分为两种情况。

(1):如果不放某一种物品,而是放这种物品前面的所有物品得到的最大value

(2):如果加入这种物品,那么就要在现有的总承重基础上减去这种物品的重量,剩余的承重才能够接

 

受该物品前面的其他物品(这些物品放在剩余的承重背包中的最大value已经算出)。这样,这种物品的value加上那些剩余的承重所放的物品的最大value就是加入这种物品之后所得到的最大value。

比较(1)和(2),取二者中较大的一个,就是在承重为2的时候,扫描过这种物品之后,能得到的最大value。

所有的最大value都存放在bestvalue数组中

bestvalue数组的意思是:一共n行,m列,其中n是物品的个数,m的意思是承重的背包个数。格式如下:

 

 1 2 3 4 5 6 7 8 9 10 11 12

1

2

3

4

5

6

7

8

 

其中bestvalue[i][j]表示:处理过前i件物品,当背包承重为j的时候,所能得到的最大value。

思路是:依次对背包的各个承重数值,扫描所有物品。举例来说,当背包的承重为1的时候,扫描所有物品,得到当承重为1时的最大value(存放在bestv[1...8][1]。其中1...8表示扫描过相应个物品之后得到的最大值)。当背包的承重为2的时候,也扫描所有物品,这时候得到的就是承重为2的时候得到的最大value(每一次扫描都需要用到前面已经计算过的数据,这或许就是dp的妙处吧)。

 公式可以在下面的链接中找到:http://www.oiers.cn/pack/P01.html

这里代码只是实现了用数组来存放最大value,并没有进行空间上的优化。

java code:

 

 

结果:90

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值