运行 代码如下
package test2;
import java.util.Scanner;
public class zeroone {
public static void main(String[] args) {
//1.输入物品种类 及 n的大小 n=5
Scanner sc = new Scanner(System.in);
System.out.print("请输入物品的种类:");
int type = sc.nextInt();
//2.输入背包容量 及 c 的大小。 c=10
System.out.print("请输入背包的容量:");
int capacity = sc.nextInt();
//3.分别输入n个物品的重量。 1 4 2 5 2.
System.out.print("请分别输入每个物品的重量:");
int[] weight = new int [5];
for(int i=0 ; i<5 ; i++) {
weight[i] = sc.nextInt();
}
//4.按序输入n个物品的价值。 1 6 5 3 1.
System.out.print("请分别输入每个物品的价值:");
int[] value = new int [5];
for(int i=0 ; i<5 ; i++) {
value[i] = sc.nextInt();
}
System.out.println("最大价值为:" + zero(type,capacity,weight,value));
}
//5.最终调用01背包方法输出最优解。
public static int zero(int n , int w , int[] weight , int[] value ) {
int[][]dp= new int[n+1][w+1];//注意为什么要加一,因为:下面的i 和 j 都是从1开始的.
for(int i = 1 ; i<=n ; i++) {
int w1 = weight[i-1];//这两个是为了让数组下表从0开始所以要减一。
int v = value[i-1];
for(int j = 1 ; j<=w ; j++) {
if(w1 > j) {
dp[i][j] = dp[i-1][j];
continue;
}
dp[i][j] = Math.max(dp[i-1][j] , dp[i-1][j-w1]+v);
}
}
return dp[n][w];
}
.
}
注意在写这种问题的时候要注意先一条一条的列出需求然后一个一个在需求里面进行补充。
这个样子写有助于提高做题思路,可以让自己的程序思想更加清晰。
我用的是 eclipse
-----------------------------------
©著作权归作者所有:来自51CTO博客作者初学java的小菜的原创作品,请联系作者获取转载授权,否则将追究法律责任
java 01背包 清晰源代码 eclipse idea
https://blog.51cto.com/u_15831800/5807224