日常吐槽,日常打代码,理论可以去看其他博客,只贴出代码,代码有注释
public static int Knapsack(int v[],int w[],int c,int n,int m[][])
{
int jMax=Min(w[n]-1,c);//自底向上,若最后一个物体的重量小于背包的总容量,取最后一个物体的重量为界限
//小于w[n]都放不不了
for(int j=0;j<=jMax;j++)m[n][j]=0;//背包容量小于最后一个物品的重量,不能放入该物品
for(int j=w[n];j<=c;j++) m[n][j]=v[n];//大于w[n]能放入
int i;
for(i=n-1;i>0;i--){//从n-1到1
jMax=Min(w[i]-1,c);
for(int j=0;j<=jMax;j++){//背包容量j小于物体w[i],则不能放入
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[0][c]=m[1][c];//此时m[1][c],m[2][c],m[3][c]......m[n-1][c],m[n][c]的最优值已算出来
if(c&