《JAVA》中利用《动态规划》实现《背包》问题

背包问题
㈠问题的描述
背包问题定义如下:设U={u1,u2,…,un}是一个准备放入背包中的n个物品的集合,si和vi分别为物品ui的体积和价值(1≤i≤n),背包的容量为C,si、vi和C均为正整数。要解决的问题是:从U中取出一些物品装入背包,装入物品的体积之和不超过C,使得背包中的物品的总价值为最大。
举例如下:
物品集合 U={u1,u2,u3,u4}
物品体积集合 S={s1,s2,s3,s4}={2,3,4,5}
物品价值集合 V={v1,v2,v3,v4}={3,4,5,8}
背包体积 C=9
正确答案是:在背包中装入物品u3和u4,物品总价值可达最大值13。
动态规划法
设Ui是物品集U的子集,它由U的前i项{u1,u2,…ui}构成。从Ui取出若干个物品装入体积为j的背包中,所形成的物品最大价值用V[i,j]表示(0≤i≤n、0≤j≤C),显然原问题可表示为V[n,C]。
V[0,j]=0 直观意义为:背包中无任何物品,最大价值为0;
V[i,0]=0 直观意义为:背包的容量为0,最大价值为0。
当i、j>0,V[i,j]是下面二个量的最大值。
V[i-1,j]:从物品子集Ui-1中取出若干物品装入体积为j的背包中所形成的价值最大值(即不装入物品ui);
V[i-1,j-si]+vi:从物品子集Ui-1中取出若干物品装入容量为j-si的背包中所形成的价值最大值。在此基础上,再加上物品ui的价值vi,显然j≥si (即装入物品ui)。

物品集合 U={u1,u2,u3,u4}
物品体积集合 S={s1,s2,s3,s4}={2,3,4,5}
物品价值集合 V={v1,v2,v3,v4}={3,4,5,7}
背包体积 C=9
这里写图片描述

求解V[i,j]核心之一:

if si>j then //物品ui体积si超过容量j,不装入。
V[i,j]←V[i-1,j] //取Ui-1的计算结果
else //物品ui体积si不超过容量j,可装入。
V[i,j]←max{V[i-1,j],V[i-1,j-si]+vi}

请注意i与j的变化规律:
i, i -1, i-2, i-3,….,i-i = 0
j-s1, j – s2, j-s3,…, 0

i与j最多有多少种组合? i*j种
最简单的情况是什么?
V[0,0], V[0,1]….V[0,j]
V[1,0]….V[i,0]
V[1,1],V[1,2],…V[1,j]
V[2,1],V[2,2],…,V[2,j]

背包算法伪代码:
Knapsack(Page 139)
输入:背包容量C、物品体积集合S={s1,s2,…,sn}、物品价值集合V={v1,v2,…,vn}。
输出:可装入背包物品的最大总价值。
(定义一个 二维数组V[0..n,0..C]用于计算和存放V[i,j]的值)
1. for i←0 to n V[i,0]←0 //背包容量为0
2. for j←0 to C V[0,j]←0 //背包未装入任何物品
3. for i←1 to n
4. for j←1 to C
5. if si>j then //物品ui体积si超过容量j,不装入。
6. V[i,j]←V[i-1,j] //取Ui-1的计算结果
7. else //物品ui体积si不超过容量j,可装入。
8. V[i,j]←max{V[i-1,j],V[i-1,j-si]+vi}
9. end if
10. end for
11. end for
12. return V[n,C] //返回最大总价值

关键算法方法

  1. for i←1 to n
  2. for j←1 to C
  3. if si>j then //物品ui体积si超过容量j,不装入。
  4. V[i,j]←V[i-1,j]//取Ui-1的计算结果
  5. else //物品ui体积si不超过容量j,可装入。
  6. V[i,j]←max{V[i-1,j],V[i-1,j-si]+vi}
  7. end if
  8. end for
  9. end for

实现:
这里写图片描述
这里写图片描述

结果打印:

=======================背包问题=======================

======================第 1 次循环======================
VS[0][0] = 0
VS[0][1] = 0
VS[0][2] = 0
VS[0][3] = 0
VS[0][4] = 0
VS[0][5] = 0
VS[0][6] = 0
VS[0][7] = 0
VS[0][8] = 0
VS[0][9] = 0

======================第 2 次循环======================
VS[1][0] = 0
 VS[i,j] = V[i-1,j] = VS[0][1] = 0
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[0][2] , VS[0][2-S[0]] + V0} = max{0, 03} = 3
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[0][3] , VS[0][3-S[0]] + V0} = max{0, 03} = 3
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[0][4] , VS[0][4-S[0]] + V0} = max{0, 03} = 3
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[0][5] , VS[0][5-S[0]] + V0} = max{0, 03} = 3
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[0][6] , VS[0][6-S[0]] + V0} = max{0, 03} = 3
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[0][7] , VS[0][7-S[0]] + V0} = max{0, 03} = 3
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[0][8] , VS[0][8-S[0]] + V0} = max{0, 03} = 3
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[0][9] , VS[0][9-S[0]] + V0} = max{0, 03} = 3

======================第 3 次循环======================
VS[2][0] = 0
 VS[i,j] = V[i-1,j] = VS[1][1] = 0
 VS[i,j] = V[i-1,j] = VS[1][2] = 3
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[1][3] , VS[1][3-S[1]] + V1} = max{3, 04} = 4
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[1][4] , VS[1][4-S[1]] + V1} = max{3, 04} = 4
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[1][5] , VS[1][5-S[1]] + V1} = max{3, 34} = 7
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[1][6] , VS[1][6-S[1]] + V1} = max{3, 34} = 7
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[1][7] , VS[1][7-S[1]] + V1} = max{3, 34} = 7
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[1][8] , VS[1][8-S[1]] + V1} = max{3, 34} = 7
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[1][9] , VS[1][9-S[1]] + V1} = max{3, 34} = 7

======================第 4 次循环======================
VS[3][0] = 0
 VS[i,j] = V[i-1,j] = VS[2][1] = 0
 VS[i,j] = V[i-1,j] = VS[2][2] = 3
 VS[i,j] = V[i-1,j] = VS[2][3] = 4
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[2][4] , VS[2][4-S[2]] + V2} = max{4, 05} = 5
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[2][5] , VS[2][5-S[2]] + V2} = max{7, 05} = 7
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[2][6] , VS[2][6-S[2]] + V2} = max{7, 35} = 8
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[2][7] , VS[2][7-S[2]] + V2} = max{7, 45} = 9
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[2][8] , VS[2][8-S[2]] + V2} = max{7, 45} = 9
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[2][9] , VS[2][9-S[2]] + V2} = max{7, 75} = 12

======================第 5 次循环======================
VS[4][0] = 0
 VS[i,j] = V[i-1,j] = VS[3][1] = 0
 VS[i,j] = V[i-1,j] = VS[3][2] = 3
 VS[i,j] = V[i-1,j] = VS[3][3] = 4
 VS[i,j] = V[i-1,j] = VS[3][4] = 5
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[3][5] , VS[3][5-S[3]] + V3} = max{7, 07} = 7
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[3][6] , VS[3][6-S[3]] + V3} = max{8, 07} = 8
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[3][7] , VS[3][7-S[3]] + V3} = max{9, 37} = 10
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[3][8] , VS[3][8-S[3]] + V3} = max{9, 47} = 11
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[3][9] , VS[3][9-S[3]] + V3} = max{12, 57} = 12

    ===============最后结果===============
    0   0   0   0   0   0   0   0   0   0
    0   0   3   3   3   3   3   3   3   3
    0   0   3   4   4   7   7   7   7   7
    0   0   3   4   5   7   8   9   9   12
    0   0   3   4   5   7   8   10  11  12

    背包的最大价值为:12
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值