DP(我的理解):
动态规划的思想于分治法的思想极其相似,但也有一定的区别。
相同点:我们解决问题的策略核心思想上是将一个我们待处理问题,逐步分解成一个子问题求解的过程,再又这个子问题逐步分解成另一个子问题,以此类推,我们通过求解子问题的结果去求解父问题。(相当于一个逆向思考的过程)。
不同点:分治法来讲,每一层的子问题都不会对父问题的状态或结果产生影响,而动态规划,每一个子问题的求解情况会直接影响到父问题的求解情况,进而互相影响。
经典背包问题:
这里我们通通不使用贪心算法去解决!!
问题描述:
一个背包的总容量为 V ,现在有 N 类物品,第 i 类物品的体积为 Volume[ i ] ,价值为 value[ i ]
那么往该背包里装东西,怎样装才能使得最终包内物品的总价值最大。
1)0-1背包
一般求解问题有两个:
1.1)背包所含物品的最大值
1.2)求出背包中物品的各个编号
算法分析:
假设已知装入包内的前 i 件物品所占的包容量为j,我们用DP[ i ][ j ]来表示前 i 件装入包内的物品所占的包容量 j 的总价值数量。
接下来我们分情况讨论:
假设现在我们要求前装入包内的前 i - 1 件物品的总价值为多少?
首先我们要判断第 i 物品装入后是否会超过包的总容量 V
–1)j < Volume[ i ] :
DP[ i ][ j ] = DP[ i-1 ][ j ]
–2) j > Volume[ i ] :
/*
这一行的意思是:
如果没有超过包的容量则装入,那么总价值就等于,前
(n-1)个装入物品的价值(注意前 i - 1个装入物品的包容量要减去第 i 个装入物品的容量—>Volume[ i ])加上第 i 个物品的价值.
*/
DP[ i ][ j ] = DP[ i - 1 ][ j - Volume[ i ] ] + value[ i ]
此时还有一个问题就是,我们没有判断添加 i 物件后与不添加 i 物品的价值总量的大小
所以问政的写法为:
DP[ i ][ j ] =Math.max( DP[ i - 1 ][ j - Volume[ i ] ] + value[ i ] ,DP[ i -1][ j ]
class Bag_01{
public static void main(String[] args) {
int n = 87;
Bag(new int[]{

动态规划与分治法在解决问题策略上有相似之处,但DP中子问题的解会影响父问题。0-1背包问题探讨了在不超过背包容量的情况下,如何最大化物品价值。当物品不能分割时,对于容量j,DP[i][j]表示前i件物品的最大价值。若j小于物品体积,DP[i][j]等于DP[i-1][j];若不小于,DP[i][j]为DP[i-1][j]与DP[i-1][j-Volume[i]]+value[i]中的较大值。本文还提及了多重背包和完全背包问题。
最低0.47元/天 解锁文章
1330

被折叠的 条评论
为什么被折叠?



