部分背包问题-贪心策略
Posted nuist__NJUPT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了部分背包问题-贪心策略相关的知识,希望对你有一定的参考价值。
部分背包问题
有n个物体,第i个物体的重量为wi,价值为vi,在总重量不超过c的情况,使得总价值最高,求最大总价值,每个物体都可以之取走一部分,价值和重量按照比例算。
输入:
5
1 2 3 4 5
3 4 3 1 4
10
输出:
13.2
算法思想:每次取单价最高的物品,可以保证最终的总价值最高。
import java.util.Arrays;
import java.util.Scanner;
public class BackPack {
public static class Obj implements Comparable<Obj>{
int w, v ;
public Obj(int w, int v){
this.w = w ;
this.v = v ;
}
public double getPrice(){
return (1.0) * v / w ;
}
@Override
public int compareTo(Obj other) { //按照单价升序排列
if(this.getPrice() == other.getPrice()){
return 0 ;
}else if(this.getPrice() > other.getPrice()){
return 1;
}else{
return -1 ;
}
}
}
public static void main(String[] args){
Scanner input = new Scanner(System.in) ;
int n = input.nextInt() ;
int [] w = new int [n] ;
int [] v = new int [n] ;
Obj [] obj = new Obj [n] ;
for(int i=0; i<n; i++){
w[i] = input.nextInt() ;
}
for(int i=0; i<n; i++){
v[i] = input.nextInt() ;
}
double C = input.nextDouble() ;
for(int i=0; i<n; i++){
obj[i] = new Obj(w[i], v[i]) ;
}
Arrays.sort(obj) ;
double maxValue = 0.0 ;
double c = C ;
for(int i=n-1; i>=0; i--){
if(obj[i].w <= c){
maxValue += obj[i].v ;
c -= obj[i].w ;
}else{
maxValue += obj[i].v * ((1.0 * c) / obj[i].w) ;
break ;
}
}
System.out.println(maxValue) ;
}
}
以上是关于部分背包问题-贪心策略的主要内容,如果未能解决你的问题,请参考以下文章