1.0-1背包问题
有N件物品和一个能装质量为W的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的总重不超过背包总重,且价值总和最大。这个问题的特点是:每种物品只有一件,可以选择放或者不放。
定义f[i][j]:在前i个物品中用容量为j的包选择所能得到的最大价值。则转移方程:f[i][j]=max{f[i-1][j],f[i-1][j-w[i]]+v[i]},v[i]和w[i]对应为第i件物品的价值和重量。
代码,对于int[] w={2,2,6,5,4};int[] v={6,3,5,4,6};注意,求得的最优解为,小于等于背包容量所能获得的最高价值
import java.util.Iterator;
import java.util.Vector;
public class bag {//背包
int maxWeight;
Vector<thing> things;//存储所选择的物品
int maxValue;
bag(){this(0);}
bag(int m){
maxWeight=m;
things=new Vector<thing>();
maxValue=0;
}
public void choose(thing[] t){//选择物品
if(t.length==0||maxWeight==0)
System.out.println("Invalid things array");
int[][] func=new int[t.length+