生日购物(贪心算法)
今天花椰妹生日,蒜头君打算给花椰妹买些礼物。蒜头君十分清楚花椰妹的喜好,知道花椰妹对每种物品的喜好程度。市场上有 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; } } }