一、什么是贪心算法
贪心算法是一种在解决问题的过程中追求局部最优的算法,对于一个有多种属性的事物来说,贪心算法会优先满足某种条件,追求局部最优的同时希望达到整体最优的效果。以背包问题为例,可以放在背包中的物体有它的重量和价值两种属性,背包的容量也是有限的,我们希望得到一种价值最大的物品摆放方式,如果我们倾向于重量贪心,那么在摆放物品的时候会优先放重量小的,但这和我们追求的价值最优没有关系,自然不能采用;如果倾向于价值贪心,而忽略了物品的重量,可能会导致摆放物品的数量不多,总价值很小;如果是以价值和重量的比值设计贪心算法求解,便可以实现最优的方案。下面我们举一些例子来说明在实际运用中如何实践贪心算法。
原文链接:https://blog.csdn.net/mayifan_blog/article/details/85063336
一般问题的根源都可以追溯到求一个特定条件下的最优值或最大值,这样可以考虑使用贪心算法。
二、1710. 卡车上的最大单元数
只能装 truckSize 个箱子到卡车上,根据贪心的思路,只需要每次都拿当前剩下的箱子里单元数量最大的箱子即可。对 boxTypes 按照 numberOfUnitsPerBox 进行逆序排序,然后从左至右填充 truckSize 即可。
public static void main(String[] args) {
int[][] ss = {{5,10},{2,5},{4,7},{3,9}};
int i = maximumUnits(ss, 10);
System.out.println(i);
}
// 请你将一些箱子装在 一辆卡车 上。给你一个二维数组 boxTypes ,其中 boxTypes[i] = [numberOfBoxesi, numberOfUnitsPerBoxi]
// numberOfBoxesi 是类型 i 的箱子的数量。
// numberOfUnitsPerBoxi 是类型 i 每个箱子可以装载的单元数量。
//整数 truckSize 表示卡车上可以装载 箱子 的 最大数量 。只要箱子数量不超过 truckSize ,你就可以选择任意箱子装到卡车上。
//返回卡车可以装载 单元 的 最大 总数。
public static int maximumUnits(int[][] boxTypes, int truckSize) {
int result = 0;
Arrays.sort(boxTypes,(a,b)->b[1]-a[1]);
for (int[] boxType : boxTypes) {
if(boxType[0] < truckSize){
truckSize-=boxType[0];
result+=boxType[0]*boxType[1];
}else{
result+=truckSize*boxType[1];
break;
}
}
return result;
}