项目利润(贪心算法)

输入: 参数1,正数数组costs 参数2,正数数组profits 参数3,正数k 参数4,正数m

costs[i]表示i号项目的花费 profits[i]表示i号项目在扣除花费之后还能挣到的钱(利润) k表示你不能并行、只能串行的最多做k个项目 m表示你初始的资金

说明:你每做完一个项目,马上获得的收益,可以支持你去做下一个 项目。

输出: 你最后获得的最大钱数


每一贪心类的题,都有一个贪心策略,这道题,用到的贪心策略:

当你的资金有限时怎么选择去做那个项目能挣的钱比较多?

肯定是在自己能做的项目中找最赚钱的

package basic_class_04;
import java.util.*;
public class Main {
	private static class Node {
		public int p;
		public int c;
		public Node(int p, int c) {
			this.p = p;
			this.c = c;
		}
	}
	
	
	private static class MinProfitComparator implements Comparator<Node>{

		@Override
		public int compare(Node o1, Node o2) {
			// TODO Auto-generated method stub
			return o1.p-o2.p;
		}	
	}
	private static class MaxCostComparator implements Comparator<Node>{

		@Override
		public int compare(Node o1, Node o2) {
			// TODO Auto-generated method stub
			return o2.c-o1.c;
		}	
	}
	
	
	public static int LessMoney(int k, int W, int[] Profits, int[] Capital){
		PriorityQueue<Node> Min = new PriorityQueue<Node>(11,new MinProfitComparator());
		PriorityQueue<Node> Max = new PriorityQueue<Node>(11,new MaxCostComparator());
		for(int i=0;i<Profits.length;i++){
			Min.add(new Node(Profits[i],Capital[i]));
		}
		int money=W;
		for(int i=0;i<k;i++){
			while(Min.peek().p<=money){
				Max.add(Min.poll());
			}
			Node priority = Max.poll();
			money -=priority.p;
			money +=priority.c;
		}
		return money;
		
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	}
	
		

}

### 贪心算法的求解流程 贪心算法是一种通过逐步选择局部最优解来构建全局最优解的方法。其核心思想是在每一步决策中选取当前状态下看起来最佳的选择,而不考虑后续可能产生的影响[^2]。 以下是贪心算法的一般求解流程: 1. **初始化**:设定初始状态或变量,通常包括目标函数、约束条件以及候选集合。 2. **迭代选择**:在每次迭代过程中,从剩余选项中挑选出满足某些特定标准的最佳项作为下一步操作的对象。 3. **更新状态**:根据所选对象调整系统的当前状态,并移除已处理过的项目以防重复计算。 4. **终止判断**:当达到预设结束条件时停止循环;这可能是所有资源被分配完毕或者无法继续改进解决方案为止。 5. **返回结果**:最后输出由上述步骤累积而成的整体方案即为最终解答。 尽管这里描述了一个通用框架,但具体实现细节取决于实际应用场景下的需求分析与建模方式[^4]。 #### 示例说明——最大利润问题 为了更直观地展示如何应用该方法解决现实世界中的挑战之一,“股票买卖的最大收益”,我们来看下面这个例子及其对应的JavaScript代码片段[^5]: 假设存在一组每日股价数据`prices=[1, 3, 2, 8, 4, 9]`, 并且交易手续费固定为 `fee=2`. 我们的目标是以最低成本买入并在适当时候卖出从而获取尽可能多的利益. ```javascript var maxProfit = function(prices, fee) { let min = prices[0], r = 0, i = 1, t; while(prices.length > i){ if (prices[i]<min){ min = prices[i]; // 更新最小价格 } else if((t = prices[i]-min-fee)>0){ r+=t; // 增加总利润 min = prices[i]-fee;//重新设置新的买入价 } i++; } return r ; }; console.log(maxProfit([1, 3, 2, 8, 4, 9],2)); // 输出应为7 ``` 此程序展示了典型的贪心策略运用案例—始终追求即时利益最大化直至遍历完整个列表。 #### 关于流程图 虽然未能提供具体的图形表示形式,但是可以想象这样一个简单的图表结构: - 开始 -> 初始化(min,r,i,t) - 循环开始: - 判断是否还有未访问节点(i<length?) - 是->进入内部逻辑分支(比较大小/累加盈利等动作) - 结束本次循环回到顶部再次评估下一个元素. - 否->跳出循环准备完成整个过程. - 完成运算得出结论(r) 以上便是关于贪心算法基本工作原理的一个概述连同实例解析部分的内容分享[^1].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SUNbrightness

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

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

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

打赏作者

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

抵扣说明:

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

余额充值