问题:给定n种物品和一个背包,物品i(1小于等于i小于等于n)的重量是Wi,其价值为Vi,背包容量为C,对每种物品只有两种选择:装入背包或者不装入背包。如下选择装入背包装入别爆的物品,使得装入背包中物品的总价值最大?
特点:每种物品仅有一件,可选择放或者不放。
用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:
f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
若放入第i件物品即“前i-1件物品放入剩下的容量为v-c[i]的背包中”,此时能获得的最大价值就是f[i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i]。
若不放入第i件物品即“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];
public class Bag
{
public int getMaxValue[][](int weight[], int value[])
{
int lenRow=weight.lenght;
int lenColumn=0;
for(int i=0;i<weight.length;i++)
lenColumn+=weight[i];
int F[][]=new int [lenRow][lenColumn];
for(int i=1;i<weight.length;i++)
{
for(int j=0;j<lenColumn;j++)
{
if(weight[i]>j)
F[i][j]=F[i-1][j];
else
{
if(F[i-1][j]>F[i-1][j-weight[i]]+value[i])
F[i][j]=F[i-1][j];
else
F[i][j]=F[i-1][j-weight[i]]+balue[i] ;
}
}
}
return F;
}
public static void main(String args[])
{
Bag test=new Bag();
int[] weight = {2,1,3,2};
int[] value = {12,10,20,15};
int[][] F = test.getMaxValue(weight, value);
for(int i = 0;i < F.length;i++)
{
for(int j = 0;j < F[0].length;j++)
System.out.print(F[i][j]+"\t");
System.out.println();
}
}
}