public class MyTest2 {
public static void main(String[] args) {
//创建物品的价值跟重量的数组
int v[] = new int[]{0, 1500, 3000, 2000};
int w[] = new int[]{0, 1, 4, 3};
int n = v.length;//设置物品的数量
int m = 5;//这里需要去查找物品重量最大值+1
//一般都会多放入一个物品是0的就是代表没有物品可以放入,
//容量也一样是从0开始,代表不能放入任何东西
//创建最佳存放物品的价值,4代表物品的种类,如果是0就只能放入0号物品,如果
// 是1就可以放入1号物品.
// 5表示物品重量的最大值+1 因为是从0到4 所以有5个列
int[][] knapsackValue = new int[n][m];
//
int[][] path = new int[n][m];
/*
这两句是这个算法的核心
knapsackValue[i][j]=knapsackValue[i-1][j]
如果这次物品不能放入,这时的价值就应该是上一个物品对于的容量的价值
Math.max(knapsackValue[i-1][j],v[i]+knapsackValue[i-1][j-w[i]]);
如果物品能够放入那么应该比较将上一个物品对于容量的价值与这次物品的价值,加他剩余的容量所能、
放入的价值。
这里面存放的值都是最大的价值
如果还不能懂就自己动手画图。
*/
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
if (w[i] > j) {
knapsackValue[i][j] = knapsackValue[i - 1][j];
} else if (w[i] <= j) {
// int value=Math.max(knapsackValue[i-1][j],v[i]+knapsackValue[i-1][j-w[i]]);
// knapsackValue[i][j]=value;
// path[i][j]=1;
if (knapsackValue[i - 1][j] >= v[i] + knapsackValue[i - 1][j - w[i]]) {
int value=knapsackValue[i-1][j];
knapsackValue[i][j]=value;
} else {
int value= v[i] + knapsackValue[i - 1][j - w[i]];
knapsackValue[i][j]=value;
path[i][j]=1;
}
}
}
}
//输出结果
for (int[] ints : knapsackValue) {
for (int anInt : ints) {
// System.out.print(anInt+"\t\t");
// System.out.printf("%-4d",anInt); //向左对齐,不够补零
System.out.printf("%04d", anInt); //输出的值的位数为4位,不够补0
System.out.printf("\t"); // 转义字符 制表符
}
System.out.println();//换行
}
//
// for (int[] ints : path) {
// for (int anInt : ints) {
// System.out.printf("%04d",anInt);
// System.out.printf("\t");
// }
// System.out.println();
// }
int i=n-1;//最后一个物品 为3
int j=m-1;//重量的最大值为m-1 为4
//循环,以i>0为结束,主要是物品不为0
System.out.println("最大价值背包内存放的物品为:");
while(i>0){
if(path[i][j]==1){
System.out.println("物品"+i+"放入背包");
j-=w[i];
}else{
i--;
}
}
}
}
01背包问题
最新推荐文章于 2024-08-24 23:00:16 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)