**
dp[n][m]含义就是:当有n种物品时且背包有m容量时,这个背包能产生的最大价值
**
状态转换关系是:dp[n][m]=dp[n-1][m],dp[n-1][m-新物品重量]
意思就是,当面对新来的一个物品时,求这个情况下,背包能产生的最大价值 相当于求下面两个情况背包能产生的最大价值:
1.无视这个新物品,不放入背包
2.一定要把这个新物品放入背包
思路:
1.首先填满最上面一排和最左边一列
接着搞个双重循环填满dp
最后返回的是这个值:
public static int knapsack(int[] w,int[] v,int c){
int stuffs=w.length;
int [][]dp=new int[stuffs][c+1];
//先初始化最上面一排和最边一列
//最上面一排,当只能用第一个stuff的时候,遍历capacity从0-c的所有可能
for (int i = 0; i <=c; i++) {
if (w[0]>i){
dp[0][i]=0;
}else {
dp[0][i]=v[0];
}
}
//最左边一列,当capacity=0时,装不了任何东西,所以最左边一列都是0
for (int i = 0; i <stuffs ; i++) {
dp[i][0]=0;
}
for (int i = 1; i <stuffs ; i++) {
for (int j = 1; j <=c ; j++) {
//比较:不拿新的stuff和一定要拿新的stuff
dp[i][j]=dp[i-1][j];
//当现在的容量能放下新物品时,比较两种情况,求出最大值:
if (j>=w[i]){
dp[i][j]=Math.max(dp[i][j],dp[i-1][j-w[i]]+v[i]);
}
}
}
return dp[stuffs-1][c];
}