动态规划 ------0-1背包问题

0-1背包问题:给定n种物品和一个背包。物品i的重量为wi , 其价值为vi,背包的容量为c 。问如何选择装入背包的物品时,使得装入背包中物品的总价值最大?

  在选择装入背包的物品时,对每种物品i只有两种选择,即装入或不装入。不能装入物品i多次或部分。

 

void Knapsack(int *v,int c,int *w,int n,int **m) { int jMax = min(w[n]-1,c); for(int j=0; j <=jMax;j++)m[n][j]=0; for(int j=w[n],j<=c;j++) m[n][j] = v[n]; for(int i=n-1; i >1; i--) { jMax = min(w[i]-1, c); for(int j=0; j <= jMax;j++) m[i][j] = m[i+1][j]; for(int j=w[i]; j <= c;j++) m[i][j] = 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] = max{m[2][c],m[2][c-w[1]]+v[1]}; } void Traceback(int **m,int *w,int c,int *x,int n) { for(int i=1;i<n;i++) if(m[i][c]==m[i+1][c]){ x[i]=0;} else {x[i]=1;c -= w[i];} x[n] = (m[n][c])?1:0; }   

 

Knapsack 时间复杂度O(nc);Traceback时间复杂度O(n);

你可能感兴趣的:(动态规划 ------0-1背包问题)