01背包问题 简书java_动态规划-01背包问题

更多文章,可关注我的 博客园 跟 掘金

60c10447c28a

01背包

01背包问题

有N件物品和一个容量为V的背包。第i件物品的体积是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。

从这个题目中可以看出,01背包的特点就是:每种物品仅有一件,可以选择放或不放。

其状态转移方程是:

f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}

填表

要理解上面的那个公式,需要学会填表。

假设

n=5, C=13, w={4,5,4,3,10}, v={9,10,9,2,24}

60c10447c28a

image

P[2,5]的含义是考虑前两个物品,装体积为5 的价值是10,背包体积就减少4,无法再装下第一个物品。也可以放弃第二个物品装第一个物品,价值是9,最大的是10。所以装第二个物品。

P[2,9]的含义是考虑前两个物品,装体积为5 的价值是10,背包体积就减少4,还能再装下第一个物品价值是9,总价值是19.另一种情况是舍弃第二件物品,直接装第一件物品价值是9,价值明显是装两件时候的大。

P[3,8]的含义是若装第三件物品价值加9,背包容量减少4,问题就变成了P[2,4]查表就知道P[2,4]最大是价值9,所以总价值是18;另一种情况是舍弃第三件物品,问题就变成P[2,8],查表发现最大价值是10。10明显没有18大,所以最大价值就是18。

P[3,9]的含义是若装第三件物品价值加9,背包容量减少4,问题就变成了P[2,4]查表就知道P[2,4]最大是价值9,所以总价值是18;另一种情况是舍弃第三件物品,问题就变成P[2,9],查表发现最大价值是19。19比18 大,所以最大值是19。

P[3,13]的含义是若装第三件物品价值加9,背包容量减少4,问题就变成了P[2,9]查表就知道P[2,9]最大是价值19,所以总价值是28;另一种情况是舍弃第三件物品,问题就变成P[2,13],查表发现最大价值是19。28比19大,所以最大值是28。

公式说明

60c10447c28a

image

假如背包要放第i件物品,

此时如果不放第i件物品,那么问题就转化为“前i-1件物品放入重量是w的背包中”,价值为f[i-1,j];

如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的重量为j-Wi的背包中”,此时能获得的最大价值就是f[i-1,j-Wi]再加上通过放入第i件物品获得的价值Pi,此时只要比较f[i-1,j]和f[i-1,j-Wi]+Pi那个大就能获取到背包里最大的价值是多少了。

代码

public class Test {

public static int getMaxValue(int[] weight, int[] value, int w, int n) {

// 创建一个二维数组,横列是物品的价值,竖列是物品的重量

int[][] table = new int[n + 1][w + 1];

for (int i = 1; i <= n; i++) { //物品

for (int j = 1; j <= w; j++) { //背包大小

if (weight[i] > j) {

//当前物品i的重量比背包容量j大,装不下,肯定就是不装

table[i][j] = table[i - 1][j];

} else {

//装得下,Max{装物品i, 不装物品i}

table[i][j] = Math.max(table[i - 1][j], table[i - 1][j - weight[i]] + value[i]);

}

}

}

return table[n][w];

}

public static void main(String[] args) {

int n = 5, w = 13; //物品个数,背包容量

int[] value = {0,9,10,9,2,24}; //各个物品的价值

int[] weight = {0,4,5,4,3,10}; //各个物品的重量

System.out.println(getMaxValue(weight, value, w, n));

}

}

参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值