在笔试的时候碰到了这个背包问题,是第一次做,因此在这里把相关的问题都总结在这里。
参考大神的代码,链接如下:https://blog.csdn.net/lanyu_01/article/details/79815801
https://blog.csdn.net/na_beginning/article/details/62884939
在这写一下java中的输出语句,在线笔试的时候连输出语句都不会写。。。。
System.out.println(); //输出完后不换行
System.out.print(); //输出后进行换行
一 .0-1背包问题
类似问题描述如下:有编号分别为a,b,c,d,e的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,每件物品数量只有一个,现在给你个承重为10的背包,如何让背包里装入的物品具有最大的价值总和?(假设N表示物品的总个数,V表示背包的总容量)
特点:对于0-1背包问题,每一件物品要么使用要么不使用。
(1)求出最大价值和的问题
利用动态规划求最优值的方法。假设用dp[i][j]来存储中间状态值(0<i<N+1,0<j<V+1),dp[i][j]表示前i件物品能装入容量为j的背包中的物品价值总和的最大值(注意是最大值),则我们最终只需求知dp[i=N][j=V]的值,即为题目所求。
现在考虑动态规划数组dp[i][j]的状态转移方程:
假设我们已经求出前i-1件物品装入容量j的背包的价值总和最大值为dp[i-1][j],固定容量j的值不变,则对第i件物品的装法讨论如下:
首先第i件物品的重量weight[i]必须小于等于容量j才行,即
1、若weight[i-1]>j,则第i件物品肯定不能装入容量为j的背包,此时dp[i][j]=dp[i-1][j]
2、若weight[i]<=j,则首先明确的是这件物品是可以装入容量为j的背包的,那么如果我们将该物品装入,则有
dp[i][j]=dp[i-1][j-weight[i]]+value[i]
随之而来的问题是我们要判断第i件物品装到容量为j的背包后,背包内的总价值是否是最大?其实很好判断,即如果装了第i件物品后的总价值dp[i-1][j-weight[i]]+value[i]>没装之前的总价值最大值d