为什么老是要和上一行进行比较?还有这两句代码语句有点不懂(能够详细的解释一下吗?)

public class Test {
public static void main(String[] args){
int w[] = {4,3,1};
int p[] = {3000,2000,1500}; //1500是吉他,3000是音响,2000是电脑。
int m = 4; //表示的是背包的容量。
int n = 3; //表示的意思是物品的个数。
//创建一个二维数组
int v[][] = new int[n+1][m+1]; //v[i][j]表示的意思是考虑钱i件物品,重量小于j的最大价值。
/*
* 为什么使用n+1和m+1?
* 为了使数组下标从0到n,0到m。
* */
//初始化第一列和第一行都为0.
for(int i=0;i<4;i++){
v[i][0]=0;
}
for(int j=0;j<5;j++){
v[0][j]=0;
}
//动态规划遍历,重新赋值。
for(int i=1;i<4;i++){
for(int j=1;j<5;j++){
if(w[i-1]>j){
v[i][j] = v[i-1][j];
}
else{
v[i][j] =Math.max(v[i-1][j],p[i-1]+v[i-1][j-w[i-1]]);
}
}
}
//遍历,看看所有的情况。
for(int i=0;i<4;i++) {
for (int j = 0; j < 5; j++) {
System.out.print(v[i][j]+" ");
}
System.out.println();
}
}
}