DP 0-1背包问题

来源:互联网 发布:淘宝商家贷款条件 编辑:程序博客网 时间:2024/05/29 19:46

问题描述:

给定n种物品和一背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。

问:该如何选择装入背包的物品,使得装入背包中物品的总价值最大?在选择装入背包的物品时,对每种物品i只有两种选择,即装入背包或不装入背包。不能将物品i装入背包中多次,也不能只装入部分的物品i。因此该问题称为0-1背包问题。

问题分析:

此问题可以使用搜索算法以及贪心算法等,在此使用动态规划算法。

1.最优子结构性质

设(y1,y2,....yn)是所给0-1背包问题的一个最优解,则(y2,y3.....yn)是下面相应子问题的一个最优解。


  •                                                                                            
  •                                                                                             
2.递归关系

设所给0-1背包问题的子问题

                                                                                                           

                                                                                                             

其最优值为m(i,j),即m(i,j)是背包容量为j,可选择物品为i,i+1,....,n时0-1背包问题的最优值。

计算m(i,j)的递归式如下:

                                                                                            

                                                                                            

3.算法描述

按递归关系计算出的最优值算法如下:

import java.util.Math;
public static void knapsack(int[]v,int[]w,int c,int[][]m)
{
int n=v.length-1;                              //int n=w.length-1
int jMax=Math.min(w[n]-1,c);          //将递归式变为代码
for(int j=0;j<=jmax;j++)                   //先解决子问题m[n][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=Math.min(w[i]-1,c);         //m[n-1][j]=m[n][j]
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]=Math.max(m[i+1][j],m[i+1][j-w[i]]+v[i]);//选择加入v[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]);
}
public static void traceback(int[][]m,int[]w,int c,int[] x)
{
int n=w.length-1;
for(int i=1;i<n;i++)
if(m[i][c]==m[i+1][c])x[i]=0;                    //m[i][c]==m[i+1][c],表明没有选择物品i
   else{x[i]=1;
    c-=w[i];}
    x[n]=(m[n][c]>0)?1:0;
}

总结:

1.还是要注意各种变量的解设,即最优值的解设方法。最优值,以及记录产生最优值时的条件等。

2.写递归式是,最小子问题不要漏掉。然后由最小子问题去求次小子问题。


0 0
原创粉丝点击