初体验--0-1背包问题(DP研究)

动态规划与分治法在解决问题策略上有相似之处,但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]中的较大值。本文还提及了多重背包和完全背包问题。

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[]{
   
   
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值