生日购物(贪心算法)

今天花椰妹生日,蒜头君打算给花椰妹买些礼物。蒜头君十分清楚花椰妹的喜好,知道花椰妹对每种物品的喜好程度。市场上有 20 种物品是花椰妹喜欢的,蒜头君虽然想把这 20 种物品全部购买,但是书包容量只有 500 。蒜头君在想怎么买东西能让花椰妹最开心呢(每种物品只能购买一次,所购买的物品空间总和不能超过背包容量)?

下面是每种物品所占用的空间,和花椰妹的喜欢程度。

2 1

10 5

22 5

23 5

23 4

32 5

13 2

35 5

21 3

22 3

25 3

35 3

64 5

34 2

85 5

88 4

85 3

82 2

76 1

98 1

package 蓝桥杯2018年B组第三次模拟赛;

import java.util.Arrays;
import java.util.Scanner;

public class 生日购物 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //贪心算法,将喜欢程度/所占空间的比值进行从大到小排序
        //或者说是将所占空间/喜欢程序的比值进行从大到小排序
        Scanner scan=new Scanner(System.in);
        int[][] arr=new int[20][2];
        for(int i=0;i<20;i++){
            for(int j=0;j<2;j++){
                arr[i][j]=scan.nextInt();
            }
        }
        Flower[] fs=new Flower[20];
        for(int i=0;i<20;i++){
            fs[i]=new Flower(arr[i][0],arr[i][1]);
        }
        Arrays.sort(fs);
        for(int i=0;i<20;i++){
            System.out.println(fs[i]);
        }
        int sum=0;//占用空间
        int xihao=0;//总喜好值
        for(int i=0;i<20;i++){
            sum+=fs[i].getKongjian();
            if(sum<500){
                xihao+=fs[i].getXihao();
                //System.out.println(fs[i].getKongjian());
            }
            else{
                sum-=fs[i].getKongjian();
                xihao+=((500-sum)*1.0/fs[i].kongjian)*fs[i].getXihao();//最后一种花不能全部买完,就买了部分(按照题目正确答案的意思)将500空间全部用完
                break;
            }
        }
        System.out.println(xihao);
    }
    

}
class Flower implements Comparable<Flower>{
    int kongjian;
    int xihao;
    public int getKongjian() {
        return kongjian;
    }
    public void setKongjian(int kongjian) {
        this.kongjian = kongjian;
    }
    public int getXihao() {
        return xihao;
    }
    public void setXihao(int xihao) {
        this.xihao = xihao;
    }
    public Flower() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Flower(int kongjian, int xihao) {
        super();
        this.kongjian = kongjian;
        this.xihao = xihao;
    }
    @Override
    public String toString() {
        return "Flower [kongjian=" + kongjian + ", xihao=" + xihao + "]";
    }
    @Override
    public int compareTo(Flower f) {
        if(this.kongjian*1.0/this.xihao>f.kongjian*1.0/f.xihao){
            return 1;
        }else if(this.kongjian*1.0/this.xihao==f.kongjian*1.0/f.xihao){
            return 0;
        }else{
            return -1;
        }
    }
    
}

 

转载于:https://www.cnblogs.com/henuLiGang/p/8643280.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值