仅供参考:有什么问题欢迎留言,共同进步。
import java.util.Scanner;
public class 背包_01问题 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//int n=sc.nextInt();物品的数量
//int m=sc.nextInt();背包的空间
int [] v={0,4,5,10,11,13};//每个物品的价值
int[] w={0,3,4,7,8,9};//每个物品所占空间
//c[i][j]=k:表示空间为j的背包,装i个物品的最大价值为k。
//空间是从1开始遍历,注意下标为0的位置。
int[][] c=new int[6][19];
dp(5,18,v,w,c);
System.out.println(c[5][18]);
int[] x=new int[6];//判断每个物品是否装入背包,1装入,0未装入
print(5,18,w,c,x);
for(int j=1 ; j<=5 ; j++){
if (x[j]==1)
System.out.println(j);
}
}
public static void dp(int n,int m,int[] v,int[] w,int[][] c){
for (int i = 1; i <=n; i++) {
for(int j=1;j<=m;j++){
if(w[i]<=j){
c[i][j]=Math.max(v[i]+c[i-1][j-w[i]],c[i-1][j]);
}
else{
c[i][j]=c[i-1][j];
}
}
}
}
//寻找最优解
public static void print(int n,int m,int[] w,int[][] c,int[] x){
for (int i = n; i>1 ; i--) {
if(c[i][m]==c[i-1][m]){//说明第i个物品没有装入背包
x[i]=0;
}
else{
x[i]=1;
m-=w[i];
}
}
x[1]=(c[1][m]>0)?1:0;
}
}