最新01背包问题讲解文稿课件PPT.pptVIP

  • 93
  • 0
  • 约6.32千字
  • 约 36页
  • 2023-10-31 发布于北京
  • 举报
01背包问题讲解文稿 0-1背包问题问题描述: 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为c。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大?0-1背包问题: 对每种物品i装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。2 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)。3 0-1背包问题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; for (j = w[n]; j = c; j++) m[n][j] = v[n] ; for ( int i=n-1; i1; 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]); } 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]); }M[ ][ ],横坐标表示所放物品号码,纵坐标表示背包容量1到C,值表示当前考虑方案的价值不选择第i个物品如何可以装下(重量允许)选择价值更大的方式(装入or不装入)处理边界情况处理边界情况7 0-1背包问题??012345678910?w1=2 v1=61w2=2 v2=32w3=6 v3=53w4=5 v4=44w5=4 v5=65?0问题实例: 有5个物品,其重量分别是{2, 2, 6, 5, 4},价值分别为{6, 3, 5, 4, 6},背包的容量为10。m[i][j]表示把第i,...,n物品装入容量为j的背包的最大价值8 0-1背包问题??012345678910?w1=2 v1=61w2=2 v2=32w3=6 v3=53w4=5 v4=44w5=4 v5=65?0问题实例: 有5个物品,其重量分别是{2, 2, 6, 5, 4},价值分别为{6, 3, 5, 4, 6},背包的容量为10。00006666666m[5][4] = 0, m[5][=4]=6m[i][j]表示把第i,...,n物品装入容量为j的背包的最大价值 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] ;9 0-1背包问题??012345678910?w1=2 v1=61w2=2 v2=32w3=6 v3=53w4=5 v4=44w5=4 v5=65?0问题实例: 有5个物品,其重量分别是{2, 2, 6, 5, 4},价值分别为{6, 3, 5, 4, 6},背包的容量为10。000066666101000006666666+v[4]容量为5的背包,考虑是否装入物品4m[i][j]表示把第i,...,n物品装入容量为j的背包的最大价值for ( int i=n-1; i1; 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]); }10 0-1背包问题??012345678910w1=2

文档评论(0)

1亿VIP精品文档

相关文档