(基于Java)算法之贪心算法——活动安排问题

贪心算法(Greedy Algorithm):又名贪婪算法。贪心算法是指,在对问题求解时,总是做出在当期看来是最好的选择。也就是说,贪心算法能决定出最好的下一步,它不是从整体最优上考虑,而仅仅是在某种意义上的局部最优解。

值得注意的是:在某些问题上,用贪心算法也能得到原问题的最优解。

活动安排问题描述:

设有n个活动的集合E={1,2,......,n},每个活动要是用同一个资源,而在同一时间内只能让一个活动使用。每个活动i都有对应的开始时间si和结束时间fi,且si<fi。该问题就是要求出所给的活动集E中最大的时间相容活动子集合。

贪心策略:最早结束时间优先 (最晚开始时间优先也是可以的,原理上一样)

定义:s[]代表开始时间,f[]代表结束时间,n表示活动个数

准备工作:先对f[]进行排序,而且保持s[]与f[]一致

下面贴出代码,因为排序可以查阅本博以前的博文,就不提供了,因此只有短短几行

public static int[] GreedyAc(int s[], int f[], int n){
int x[] = new int[n];
x[0] = 1;
int j = 0; //j用来表示f数组的下标值
for(int i = 1; i < n; i++){
//判断下一个活动的开始时间是否比当前活动的结束时间晚
if(s[i] >= f[j]){
x[i] = 1;
j = i;
}
}
return x;
}


另外,贪心算法也有一个跟0-1背包问题类似的背包问题,但是背包问题的要求跟0-1背包问题的要求不同,背包问题不一定要把物品整个装进背包,可以把物品分成一部分来装入背包。贪心策略只要设计成 Vi与Wi的比值优先就可以了。

如果有什么不对的地方或者有更好建议,欢迎评论留言

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于背包问题的贪心算法,可以按照物品的单位重量价值进行排序,然后依次选择单位重量价值最高的物品放入背包中,直到背包装满或者没有可选的物品为止。这个算法可以通过以下Java代码实现: ```java public class KnapsackGreedy { public static int maxValue(int[] values, int[] weights, int max){ if(values == null || values.length == 0){ return 0; } if(weights == null || weights.length == 0){ return 0; } if(max <= 0){ return 0; } int n = values.length; double[] valuePerWeight = new double[n]; for(int i=0; i<n; i++){ valuePerWeight[i] = (double) values[i] / weights[i]; } int[] sortedIndex = new int[n]; for(int i=0; i<n; i++){ sortedIndex[i] = i; } Arrays.sort(sortedIndex, (a, b) -> Double.compare(valuePerWeight[b], valuePerWeight[a])); int maxValue = 0; int currentWeight = 0; for(int i=0; i<n; i++){ int index = sortedIndex[i]; if(currentWeight + weights[index] <= max){ maxValue += values[index]; currentWeight += weights[index]; } } return maxValue; } public static void main(String[] args) { int[] values={6,3,5,4,6}; int[] weights={2,2,6,5,4}; int max = 10; System.out.println(maxValue(values,weights,max)); } } ``` 以上是一个简单的贪心算法实现,它通过计算每个物品的单位重量价值,并按照降序对物品进行排序。然后依次选择单位重量价值最高的物品放入背包中,直到背包装满或者没有可选的物品为止。该算法的时间复杂度为O(nlogn),其中n为物品的数量。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [背包问题(Java实现)——贪心算法](https://blog.csdn.net/qq_40956679/article/details/83684383)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [java语言贪心算法之背包问题](https://blog.csdn.net/ityw520/article/details/121514232)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

คิดถึง643

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值