贪心算法-- 部分背包问题

点击查看:贪心算法模块精讲

题目描述:
  • 有n个物体,第i个物体的重量为wi,价值为 vi 。在重量不超过C的情况下让总价值尽量高。
  • 每一个物体都可以只取走一部分,价值和重量按比例计算。
  • 求最大总价值
  • 注意:每个物体可以只拿一部分,因此一定可以让总重量恰好为C
题目很容易理解,直接写代码
如果打包封装内部类及内部类的方法重写部分看不懂(应加深对面向对象的学习),也可以参考此博客后半部分进行学习
/*为方便理解,本题直接用样例表示,而非键盘输入 */
import java.util.*;
public class Main{
    public static void main(String[] args){
        int [] w = {1 , 3 , 2 , 4 , 5};
        int [] v = {3 , 3 , 4 , 1 , 4};
        int n = w.length;
        double c = 10;
        Obj[] objs = new Obj[n];
        for(int i=0;i<n;i++){
            objs[i] = new Obj(w[i] , v[i]);
        }
        Arrays.sort(objs);
        double maxValue = 0;
        for(int i=n-1;i>=0;i--){
            if(objs[i].w <= c){
                maxValue += objs[i].v;
                c -= objs[i].w;
            }else{
                maxValue += objs[i].v*(c/objs[i].w);
                break;
            }
        }
    }
    // 用了内部类 将w和v绑定在一块。也可以用外部类
    private static class Obj implements Comparable<Obj>{
        int w;
        int v;
        public Obj(int w,int v){
            this.w = w;
            this.v = v;
        }
        public double getPrice(){
            return v/(double)w;
        }
        @Override 
        public int compareTo(Obj o){
            //此处如果直接用下面这句,可能会产生  0 = (int)3.2-3.1
            // 从而导致错误
            //return (int) (this.getPrice()-o.getPrice());
            if(this.getPrice()-o.getPrice()>0) return 1;
            else if(this.getPrice()-o.getPrice()<0) return -1;
            else return 0;
        }
        @Override
        public String toString() {
            return "Obj [w=" + w + ", v=" + v +", price="+getPrice()+ "]";
        }
    }
}
运行结果: 13.2

在这里插入图片描述

发布了52 篇原创文章 · 获赞 7 · 访问量 1786

猜你喜欢

转载自blog.csdn.net/weixin_44107920/article/details/104103749