算法设计与分析 第七周
IPO
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;