自己写的,代码直接可用。
package knapsack;
public class Knapsack_DynamicProgramming {
/*
* 使用动态规划实现01背包问题
*/
/**有4件物品*/
static final int n=4;
/**背包最大承重为9*/
static int maxWeight=9;
public static void main(String[] args) {
int weight[]={0,2,3,4,5};//4件物品的重量
int value[]={0,3,4,5,7};//4件物品的价值
int values[][]=new int[n+1][maxWeight+1];//存放当前子结构中的最优价值,用于输出
for(int i=0;i<=maxWeight;i++)
values[0][i]=0;//第0行全为0
for(int i=0;i<=n;i++)
values[i][0]=0;//第0列全为0
for(int i=1;i<=n;i++){
for(int j=1;j<=maxWeight;j++){
if(j<weight[i])
values[i][j]=values[i-1][j];//如果物品i的重量超过背包可放重量,将他上面的数即目前最优装载数写入
else{//可以将物品i放入背包,需要从【目前最优】和【之前最优并加入当前物品】取大
values[i][j]=Math.max(values[i-1][j], values[i-1][j-weight[i]]+value[i]);
}
System.out.print(values[i][j]+" ");
}
System.out.println();
}
System.out.println();
System.out.print("最优值为"+values[n][maxWeight]+",最优装载为 ");
for(int i=n;i>0;i--){
if(values[i][maxWeight]>values[i-1][maxWeight]){
System.out.print("第"+i+"件 ");
maxWeight-=weight[i];
}
}
System.out.print("物品。");
}
}