算法设计与分析 第七周 IPO

本文通过一道IPO问题介绍贪心算法的应用。作者首先分析了问题,设计了初始算法,然后针对超时问题进行了优化,包括避免不必要的遍历和使用分段策略减少访问次数。最后,文章提供了不同版本的代码实现和测试结果。
摘要由CSDN通过智能技术生成


1.题目描述

在这里插入图片描述


2.选题原因

学习了贪心算法,随机选择了一道题目。


3.题目分析及算法

3.1分析

贪心算法的本质即是:每一步都选择当前最好的点,不一定能够得到全局最优解,但一定要得到局部最优解。结合这道题来考虑,按照贪心算法的思路,在当前步,我算要考虑的就是我手中所能投资的项目中获利最大的。有了思路,操作起来就非常简单了。按照我们的思路,在每一步,我们都要先找到所有能够资助的项目,并维护一个获利最大的项目。


3.2第一版算法

算法总结如下:
初始化一个最大利润max_pro = 0;该项目代号max_cap = -1;
遍历所有项目:

  • 若项目能够资助,并且获利current_pro > max_pro,更新max_pro, max_cap
    max_cap == -1,说明当前没有能够资助的项目,或者能够资助的项目零利润,则不进行操作
    否则本金增加,该投资项目对应利润置为0

4代码与改进

4.1第一版

4.1.1关键代码-查找最优项目

        for (int i = 0; i < k; i++) {
        	//初始化最大利润与项目
            int max_pro = 0;
            int max_pos = -1;
            for (int j = 0; j < size; j++) {
            	//该项目优于上一个项目
                if (pro[j] > max_pro && cap[j] <= W) {
                    max_pos = j;
                    max_pro = pro[j];
                }
            }
            //没有好的投资项目
            if (max_pos == -1) {
                continue;
            }
            //已投资过项目无法再次获利
            pro[max_pos] = 0;
            //增加本金
            W += max_pro;
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值