部分背包问题-贪心策略

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

以上是关于部分背包问题-贪心策略的主要内容,如果未能解决你的问题,请参考以下文章

背包问题(贪心策略)

分数背包(贪心策略)

贪心策略背包问题——阿里巴巴与四十大盗

贪心策略背包问题——阿里巴巴与四十大盗

贪心策略 题解(合集)

背包问题看贪心算法原理