贪心法

贪心算法是一种在每一步选择中都采取当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。本文将探讨贪心算法的基本思想,常见问题类型,以及它与动态规划的区别。通过对经典案例的分析,帮助读者深入理解并掌握如何在实际问题中应用贪心算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、圣诞老人的礼物

 

 

 

 

 

一、圣诞老人的礼物

【题目】

          有多箱不同的物品,每箱物品有价值和重量。每箱物品可以任意拆分。最多只能装重量W的物品。请问,最多能装多大价值的物品。

 

样例输入:

4  15                                            //4代表一共有4箱物品。15代表一共可以装15的重量。

100 4                                           //第1箱物品价值100。第一箱物品重量是4。

412 8                                           //第2箱。

266 7                                           //第3箱。

591 2                                           //第4箱。

 

样例输出:

1193.0

 

【分析】

当然是装满了最好。首先求出每种物品的单价。第一箱为10/4=25;第2箱为412/8=51.5;第3箱为266/7=38;第4箱为591/2=295.5。

所以装的顺序为:4、2、3、1。

(1)装第四箱,剩余重量为13,已有价值591。

(2)再装第2箱,剩余重量5,已有价值591+412=1003

(3)再装第3箱,剩余重量为0。能够装完。价值1003+266*5/7 =  1003+190 = 1193。

 

 

       

【代码】

//Candy.java

package cn.itcast.demo01;

public class Candy{
    private double value;   //价值
    private double weight;  //重量
    private double val;     //单价
    
    public Candy(double value, double weight){
        this.weight = weight;
        this.value = value;
        this.val = value/weight;
    }

    public double getValue() {
        return value;
    }

    public void setValue(double value) {
        this.value = value;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public double getVal() {
        return val;
    }

    public void setVal(double val) {
        this.val = val;
    }    
    
}
 

//

package cn.itcast.demo01;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;

public class gift {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        double w = sc.nextDouble();
        double totalWeight =0.0;
        double totalValue = 0.0;
        

        ArrayList<Candy> li = new ArrayList<Candy>();
        
        for(int i=0;i<n;i++){
            double value = sc.nextDouble();
            double weight = sc.nextDouble();
            Candy can = new Candy(value,weight);
            li.add(can);
            
            totalWeight +=weight;
            totalValue +=value;
        }
        
        if(totalWeight <=w){
            System.out.println(totalValue);
            return ;
        }
        
        for(Candy i:li){
            System.out.println(i.getValue() + "..." + i.getWeight());
        }
        
        Collections.sort(li,new Comparator<Candy>(){                       //排序。
            public int compare(Candy c1,Candy c2 ){
                if(c1.getVal() < c2.getVal()){
                    return -11;
                }else if(c1.getVal() > c2.getVal()){
                    return 1;
                }else{
                    return 0;
                }
            }
        });
        
        for(Candy i:li){
            System.out.println(i.getValue() + "..." + i.getWeight());
        }
        
        double result = 0.0;
        for(int i = 0 ;w!=0;i++){
            if(w>=li.get(i).getWeight()){        //都能装进去
                result +=li.get(i).getValue(); //价值变成了这么多
                w = w-li.get(i).getWeight();    //还能装这么多
            }else{                         //只能装w这么多了
                result += (li.get(i).getValue() * w/li.get(i).getWeight());
                w =0;
            }
        }
        System.out.println(result);
        
        return;
        
    }
    

}
 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值