背包问题讲解文稿

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
000 06666666
m[i][j]表示把第i,...,n物品装入容量为j的背包的最大价值
0-1背包问题
➢ 问题实例: 有5个物品,其重量分别是{2, 2, 6, 5, 4},价
值分别为{6, 3, 5, 4, 6},背包的容量为10。
012
容量为5的背包,考虑是否装入物品4
0 w1=2 v1=6 1
w4=5 v4=4 4 0 0 0 0 6 6 6 6 6 10 10
w5=4 v5=6 5 0 +0v[4] 0 0 6 6 6 6 6 6 6
m[i][j]表示把第i,...,n物品装入容量为j的背包的最大价值
0-1背包问题
➢ 问题实例: 有5个物品,其重量分别是{2, 2, 6, 5, 4},价
➢解空间图示: 以3个物品为例,解(0,1,0)表示(不取物品0, 取物品1,不取物品2)
root
0
1
0
1
0
1
0
10
0-1背包问题
➢问题转化: 给定c>0,wi>0,vi>0,1≤i≤n,要
求找出一个n元0-1向量(x1,x2,…,xn), xi∈{0,1},1≤i≤n,使得∑wixi≤c,而 且∑vixi达到最大。
0 1 2 3 4 5 6 7 8 9 10
m[5][<4] = 0, m[5][>=4]=6
int jMax=Math.min(w[n]-1,c); for (j = 0; j <= jMax ;j++) m[n][j] = 0; for (j = w[n]; j <= c; j++) m[n][j] = v[n] ;
❖}
0-1背包问题
➢ 问题实例: 有5个物品,其重量分别是{2, 2, 6, 5, 4},价
值分别为{6, 3, 5, 4, 6},背包的容量为10。
0 1 2 3 4 5 6 7 8 9 10 0 w1=2 v1=6 1 w2=2 v2=3 2 w3=6 v3=5 3 w4=5 v4=4 4 w5=4 v5=6 5
第i+1个物品装入背包
第i+1个物品不装入背包
m ( i,j) m m ( a i 1 ,x m j) ( i m { ,( 1 i, j1 ) ,j w i) v i}0 j j w iw i
第i+1个物品无法装入背包
0-1背包问题 M[ ][ ],横坐标表示所放物品号码,纵坐标表示
背包容量1到C,值表示当前考虑方案的价值
n
max vi xi i 1
n
wi xi C
i1
xi {0,1},1 i n
0-1背包问题
➢ 设所给0-1背包问题的子问题的最优值为m(i,j), 即m(i,j)是背包容量为j,可选择物品为i,i+1, …,n时0-1背包问题的最优值。
➢ 由0-1背包问题的最优子结构性质,可以建立计
算m(i,j)的递归式如下:
m[i][j]表示把第i,...,n物品装入容量为j的背包的最大价值
0-1背包问题
➢ 问题实例: 有5个物品,其重量分别是{2, 2, 6, 5, 4},价
值分别为{6, 3, 5, 4, 6},背包的容量为10。
0 w1=2 v1=6 1 w2=2 v2=3 2 w3=6 v3=5 3 w4=5 v4=4 4 w5=4 v5=6 5

for (j = w[i] ; j <= c; j++选) 择价值更大的方式(装入or不装入)

m[i][j]=Math.max(m[i+1][j],m[i+1][j-w[i]]+v[i]);

}

m[1][c] =m[2][c];
ቤተ መጻሕፍቲ ባይዱ
处理边界情况

if (c >= w[1])
m[1][c]=Math.max(m[1][c],m[2][c-w[1]+v[1]);
处理边界情况

for (j = w[n]; j <= c; j++) m[n][j] = v[n] ;

for ( int i=n-1; i>1; i--)

{ int jMax=Math不.m选i择n(第w[i个i]-物1,品c);

for (j = 0; j <= jMax;如j+何+可) 以m装[下i][(j]重=量m允[许i+)1][j];
值分别为{6, 3, 5, 4, 6},背包的容量为10。
0 1 2 3 4 5 6 7 8 9 10 0 w1=2 v1=6 1 0 0 6 6 9 9 12 12 15 15 15 w2=2 v2=3 2 0 0 3 3 6 6 9 9 9 10 11 w3=6 v3=5 3 0 0 0 0 6 6 6 6 6 10 11 w4=5 v4=4 4 0 0 0 0 6 6 6 6 6 10 10 w5=4 v5=6 5 0 0 0 0 6 6 6 6 6 6 6
w2=2 v2=3 2 w3=6 v3=5 3
3 4 5 6 7 8 9 10
for ( int i=n-1; i>1; i--) { int jMax=Math.min(w[i]-1,c); for (j = 0; j <= jMax; j++) m[i][j] = m[i+1][j]; for (j = w[i] ; j <= c; j++) m[i][j]=Math.max(m[i+1][j],m[i+1][j-w[i]]+v[i]); }
0-1背包问题
➢解空间: 设Xi表示第i件物品的取舍,1代表取,0代
表舍,搜索的空间为n元一维数组( X1,X2,X3,……,Xn)
➢取值范围: 为(0,0,0……,0,0),(0,0,0……,
0,1),(0,0,0……,1,0),(0,0,
0……,1,1),……,(1,1,1……,1,1)。
0-1背包问题
算法案例 0-1背包问题
刘蕾、文艺蓉、周家欣
0-1背包问题
➢问题描述: 给定n种物品和一背包。物品i的重量是
wi,其价值为vi,背包的容量为c。问应如 何选择装入背包中的物品,使得装入背包 中物品的总价值最大?
➢0-1背包问题: 对每种物品i装入背
包或不装入背包。不 能将物品i装入背包多 次,也不能只装入部 分的物品i。
❖ void Knapsack(int v[], int w[], int c, int n, int m[][] )
❖ { int n=v.length-1;

int jMax=Math.min(w[n]-1,c);

for (j = 0; j <= jMax ;j++) m[n][j] = 0;
相关文档
最新文档