0-1背包问题讲解:https://www.cnblogs.com/arsenalfaninecnu/p/8945548.html
代码
/*
*
最多可以放8公斤的物品
物品1:3公斤 价值4元
物品2:5公斤 价值4元
物品3:2公斤 价值3元
物品4:6公斤 价值5元
物品5:4公斤 价值3元
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 4 4 4 4 4 4 4 4 4 4
0 0 0 4 4 4 4 4 8 8 8 8 8
0 0 3 4 4 7 7 7 8 8 11 11 11
0 0 3 4 4 7 7 7 8 9 11 12 12
0 0 3 4 4 7 7 7 8 10 11 12 12
*/
public class Main {
public static void main(String[] args) {
//定义一个数组a[i][j] = a[i] i表示当前物品的序号选上,j表示这个位置能得到的最大值
//选或者不选动态规划
// Scanner scn = new Scanner(System.in);
int [] w = {3,5,2,6,4};//表示每件物品的重量
int [] v = {4,4,3,5,3}; //表示每件物品的价值
// for(int i=1;i<6;i++) {
// w[i] = scn.nextInt();//输入重量
// v[i] = scn.nextInt();//输入价值
// }
int [][] f = new int[6][13]; //8表示背包最多能放8公斤的重量
int[][] path = new int[6][13];
for(int j=0;j<f[0].length;j++) { //初始化每一行
f[0][j] = 0;
}
for(int i=0;i<f.length;i++) { //背包的重量为0的时候,最大价值肯定是0
f[i][0] = 0;
}
for(int i=1;i<f.length;i++) { //从第一个物品开始选,记录我选了前面出现的物品,背包重量从1-8的能选上的最大的值
for(int j=1;j<f[0].length;j++) { //当i循环到最后一层5的时候,也就是得到了,我5件物品都选上的时候的最大的值
if(w[i-1]<=j) { //重量比这个状态小,那么就能放。 那么就只是放与不放,看是放重量大,还是不放重量大
if(f[i-1][j]<f[i-1][j-w[i-1]]+v[i-1]){
f[i][j] = f[i-1][j-w[i-1]]+v[i-1];
path[i][j] = 1;
}else{
f[i][j] = f[i-1][j];
}
}else {
f[i][j] = f[i-1][j];//第i件物品不能放
}
}
}
for(int i=0;i<f.length;i++) {
for(int j=0;j<f[0].length;j++) {
System.out.printf("%-5d",f[i][j]);
}
System.out.println();
}
int i=f.length-1;
int j=f[0].length-1;
while(i>0&&j>0){
if(path[i][j] == 1){
System.out.print("第"+i+"个物品装入 ");
j -= w[i-1];
}
i--;
}
}
}
结果: