贪心算法Java实现

贪心算法-集合覆盖

1、基本原理
1)遍历所有电台,找到一个覆盖了最多未覆盖地区的电台;
2)把该电台加入到一个集合中,再设法把该电台覆盖的地区在下一次比较时去掉;
3)重复第一步,直到不存在未覆盖地区。

public class Greedy {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//构建一个哈希表,存放所有电台名字和覆盖的地区
		HashMap<String, HashSet<String>> broadcasts = new HashMap<String, HashSet<String>>();
		// 构建一个集合,存放所有未覆盖地区
		HashSet<String> allAreas = new HashSet<String>();
		// 构建一个ArrayList,存放选择的电台
		ArrayList<String> selected = new ArrayList<String>();
		// 构建一个临时集合,存放遍历每个电台过程中,每个电台覆盖地区和当前未覆盖地区的交集
		HashSet<String> tmpSet = new HashSet<String>();
		// 构建一个String,存放所有电台中与当前未覆盖地区交集最大的电台
		String maxKey = null;
		// 把所有电台存放到哈希表中
		HashSet<String> hashSet1 = new HashSet<String>();
		hashSet1.add("北京");
		hashSet1.add("上海");
		hashSet1.add("天津");
		HashSet<String> hashSet2 = new HashSet<String>();
		hashSet2.add("广州");
		hashSet2.add("北京");
		hashSet2.add("深圳");
		HashSet<String> hashSet3 = new HashSet<String>();
		hashSet3.add("成都");
		hashSet3.add("上海");
		hashSet3.add("杭州");
		HashSet<String> hashSet4 = new HashSet<String>();
		hashSet4.add("上海");
		hashSet4.add("天津");
		HashSet<String> hashSet5 = new HashSet<String>();
		hashSet5.add("杭州");
		hashSet5.add("大连");
		broadcasts.put("K1", hashSet1);
		broadcasts.put("K2", hashSet2);
		broadcasts.put("K3", hashSet3);
		broadcasts.put("K4", hashSet4);
		broadcasts.put("K5", hashSet5);
		// 把所有地区存放到集合allAreas中
		allAreas.add("北京");
		allAreas.add("上海");
		allAreas.add("天津");
		allAreas.add("广州");
		allAreas.add("深圳");
		allAreas.add("成都");
		allAreas.add("杭州");
		allAreas.add("大连");
		while(allAreas.size() > 0) {
			maxKey = null;
			for(String key: broadcasts.keySet()) {
				tmpSet.clear();// 临时集合,存放遍历每个电台过程中,每个电台覆盖地区和当前未覆盖地区的交集
				HashSet<String> areas = broadcasts.get(key);// 构建一个集合存放当前电台key可以覆盖的地区
				tmpSet.addAll(areas);// 把当前电台可覆盖的区域放入临时集合中
				tmpSet.retainAll(allAreas);// 求得当前电台的可覆盖地区和全部未覆盖地区的交集
				if(tmpSet.size() > 0 && (maxKey == null || tmpSet.size() > broadcasts.get(maxKey).size())) {
					maxKey = key;
				}
			}
			if(maxKey != null) {
				selected.add(maxKey);
				allAreas.removeAll(broadcasts.get(maxKey));
			}
		}
		System.out.println("结果是" + selected);
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
贪心算法是一种求解最优问题的算法,它在每一步选择中都采取在当前状态下最好或最优的选择,从而希望得到全局最优解。贪心算法通常可以用贪心选择性质来证明。在实现上,贪心算法一般使用循环和条件语句来实现。 下面是一个贪心算法求解背包问题的Java代码实现: ``` import java.util.Arrays; public class Knapsack { public static void main(String[] args) { int[] weights = {10, 20, 30}; // 物品重量 int[] values = {60, 100, 120}; // 物品价值 int capacity = 50; // 背包容量 double maxValue = knapsack(weights, values, capacity); // 求解最大价值 System.out.println("最大价值为:" + maxValue); } public static double knapsack(int[] weights, int[] values, int capacity) { int n = weights.length; double[] ratios = new double[n]; // 计算每个物品的性价比 for (int i = 0; i < n; i++) { ratios[i] = (double) values[i] / weights[i]; } double maxValue = 0; while (capacity > 0) { // 循环选择最优物品放入背包 int index = getMaxRatioIndex(ratios); if (index == -1) { break; } if (weights[index] <= capacity) { maxValue += values[index]; capacity -= weights[index]; } else { maxValue += ratios[index] * capacity; capacity = 0; } ratios[index] = -1; // 标记已经选过的物品 } return maxValue; } public static int getMaxRatioIndex(double[] ratios) { // 获取当前性价比最高的物品下标 int index = -1; double maxRatio = 0; for (int i = 0; i < ratios.length; i++) { if (ratios[i] > maxRatio) { maxRatio = ratios[i]; index = i; } } return index; } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值