问题:背包最大容量maxweight,不同物件质量和价值weight[],value[]
求出背包能装最大质量物件且物件不能重复的前提下所装的最大价值为多少
思路:将不同情况制作成bv[i][j]矩阵
且每个块的值有两种情况选当前物品和不选当前物品。
选当前物品:应考虑到背包容量是否在选完物品后有剩余,即还能装其他物品,则价值为当前物品价值加上剩余容量的最大价值,而容量x的最大价值的情况为bv[i-1][x],即上一行中背包容量为x的块
b[i][j]=value[i]+bv[i-1][j-weight[i]]
不选当前物品:直接取上一行中相同列背包的块
bv[i][j]=bv[i-1][j]
ps:特殊情况 第一列时第一种情况块的值直接设置为value[i]即可,第二种情况直接设置为0.
背包容量(kg)(行为i列为j) | 1 | 2 | 3 | 4 |
物品1 | 150 | 150 | 150 | 150 |
物品2 | 150 | 150 | 200 | 350 |
物品3 | 150 | 150 | 200 | 450 |
public class backpack {
public static void main(String[] args) {
int maxweight=4;
int weight[]= {1,3,4,74};
int value[]= {150,200,300};
int bv[][]= new int[weight.length][maxweight+1];//最大价值矩阵
for(int i=0;i<weight.length;i++)
{
for(int j=1;j<=maxweight;j++)
{
if(weight[i]<=j)//如果当前背包空间大于当前物品的重量
{
if(i==0)
bv[i][j]=value[i];
else bv[i][j]=Math.max(bv[i-1][j],value[i]+bv[i-1][j-i]);
}
else //背包当前空间小于当前物品质量 则取上一级的值
{
if(i==0)
bv[i][j]=0;//若都一个当前物品就大于当前背包容量
else
bv[i][j]=bv[i-1][j];
}
}
}
int maxcount=0;
for(int i=0;i<bv.length;i++)//打印结果
{
for(int j=0;j<bv[i].length;j++)
{
if(bv[i][j]>=maxcount)
maxcount=bv[i][j];//找到最大值
System.out.print(bv[i][j]+" ");
}
System.out.println();
}
System.out.println("背包最大的价值是:"+maxcount);
}
}