0-1揹包问题

问题描述:现有n个物品和一个揹包,每个物品的重量是w[i],每个物品的价值是p[i],揹包所能承受的最大重量是limitw,求应该选择哪些物品装入揹包中可使这些物品的价值最大并且不能超过揹包能承受的最大重量
 
特点:每个物品只有一件,并且只有两种选择 放或者不放 考虑:在不超过揹包容量的情况下可以选择单位容量下价值最大的物品(价值密度),将价值密度大的物品尽可能多的放入揹包。

public class AA {

    public static void main(String[] args) {

Scanner s = new Scanner(System.in);

System.out.println(“请输入物品的数量n”);

int n =s.nextInt();

System.out.println(“请输入揹包的最大重量limitw”);

int limitw = s.nextInt();

System.out.println(“请输入每个物品的价值p”);

int [] p =new int[n];

for (int i = 0; i < p.length; i++) {

p[i]=s.nextInt();

}

System.out.println(“请输入每个物品的重量w”);

int [] w =new int[n];

for (int i = 0; i < w.length; i++) {

w[i]=s.nextInt();

}

int [] r = new  int [n];

for (int i = 0; i < n; i++) {

r[i]=p[i]/w[i];//计算价值密度,放入一个数组中

}

System.out.println(“排序前p”+Arrays.toString(p));

System.out.println(“排序前w”+Arrays.toString(w));

System.out.println(“排序前r”+Arrays.toString(r));

//根据价值密度对物品的重量和价值重新排序,

for (int i = 0; i < n-1; i++) {

for (int j = i+1; j < n; j++) {

if(r[i]<r[j]){                              //首先对价值密度排序

int temp = r[i];

r[i]=r[j];

r[j]=temp;


//对每个物品的价值排序

int x = p[i];

p[i]=p[j];

p[j]=x;

//对每个物品的重量排序

int m = w[i];

w[i]=w[j];

w[j]=m;

}

}

}

System.out.println(“————————————–“);

System.out.println(“排序后r”+Arrays.toString(r));

System.out.println(“排序后p”+Arrays.toString(p));

System.out.println(“排序后w”+Arrays.toString(w));

int [] x = new int[n];//定义一个向量数组

for (int i = 0; i < w.length; i++) {

if(w[i]<limitw){

limitw =limitw-w[i];//计算剩余的容量

x[i]=1;

}

}

int value=0;

int finalW =0; //根据向量数组选择物品

for (int i = 0; i < x.length; i++) {

if(x[i]==1){

value+=p[i];

finalW+=w[i];

}

}

System.out.println(Arrays.toString(x));

System.out.println(“value “+value);

System.out.println(“limitw “+limitw);

}

}

点赞