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);

}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值