/**
* 背包问题:有n个物品和一个大小为m的背包,给定数组A表示每个物品的大小和数组V表示每个物品的价值
* 问最多能装入背包的总价值是多大?
* 转换问题为:从n个商品中做选择,当包的大小为m时的最大价值
* 状态F(i,j):从i个商品中做选择,当包的大小为j时的最大价值
* (1)A[i-1]<=j: 不放:F(i,j)=F(i-1,j) 放:F(i,j)=F(i-1,j-A[i-1])+V[i-1]
* F(i,j) = Math.max(F(i-1,j),F(i-1,j-A[i-1])+V[i-1]
*
* (2)A[i-1]>j: F(i,j)=F(i-1,j) 表明背包放不下
*
* 初始状态:F(i,0)=F(0,j)=0
*
* 返回F(n,m)
*/
public static int maxValueBag(int m,int[] A,int[] V){
int n=A.length;
if (m == 0 || n == 0) {
return 0;
}
//第0行或者第0列为0
int[][] F = new int[n+1][m+1];
for(int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
if (A[i-1]<=j){
F[i][j] = Math.max(F[i-1][j],F[i-1][j-A[i-1]]+V[i-1]);
}else {
F[i][j] = F[i-1][j];
}
}
}
return F[n][m];
}