【贪心法】程序存储问题

题目描述:

设有n个程序{1,2,…, n }要存放在长度为L 的磁带上。程序i存放在磁带上的长度是li,1≤i≤n 。程序存储问题要求确定这n个程序在磁带上的一个存储方案,使得能够在磁带上存储尽可能多的程序。

编程任务:

  对于给定的n 个程序存放在磁带上的长度,编程计算磁带上最多可以存储的程序数。

数据输入:

  (由文件input.txt 给出输入数据。)第一行是2个正整数,分别表示文件个数n 和磁带的长度L。接下来的1行中,有n个正整数,表示程序存放在磁带上的长度。

结果输出:

  将编程计算出的最多可以存储的程序数输出(到文件output.txt)

输入文件示例输出文件示例

input.txt                        output.txt

6 50                             5

2 3 13 8 80 20

注:若题目要求含上述括号中橙色字体,即将代码第11、12行注释解除,让其执行即可。

代码如下:

#include <iostream>
#include <algorithm>//sort()头文件 
#include <fstream>//文件读写操作头文件 
using namespace std;
#define N 10000

bool cmp(int x,int y){
	return x<y;
}
int main(){
	//freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);
	int n,L; cin>>n>>L;//输入文件个数,磁带长度
	int Long[N];
	for(int i=0;i<n;i++){
		cin>>Long[i];
	} 
	sort(Long,Long+n,cmp);//以升序排列 
	int flag=0;//记录存储第flag个程序,flag从0开始(数组存储从0开始) 
	int LongSum=0;//记录存储的程序长度和 
	int Num=0;//记录存储的程序个数 

	while(flag<n){
		LongSum=LongSum+Long[flag];//求和 
		if(LongSum>L) break;//超出磁带长度,跳出循环 
		else Num++;
		flag++; 
	}
	cout<<Num<<endl;
	return 0;
}

贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法贪心算法在解决程序存储问题(如活动选择问题、背包问题等)时非常有效。其设计思想主要包括以下几个步骤: 1. **问题建模**:将问题抽象成一个数学模型,明确问题的目标和约束条件。 2. **贪心选择**:在每一步选择中都做出当前看来最好的选择,即局部最优选择。 3. **证明最优性**:通过数学证明或反证法,验证贪心选择能够导致全局最优解。 下面以活动选择问题为例,介绍贪心算法的设计思想: ### 活动选择问题 问题描述:给定一组活动,每个活动都有一个开始时间和结束时间。求最多能安排多少个互不冲突的活动。 #### 贪心算法设计步骤: 1. **问题建模**: - 输入:活动集合 \( S = \{a_1, a_2, \ldots, a_n\} \),每个活动 \( a_i \) 有一个开始时间 \( s_i \) 和结束时间 \( f_i \)。 - 输出:最大互不冲突的活动子集。 2. **贪心选择**: - 选择结束时间最早的活动,因为这会留出更多的时间给后续活动。 3. **证明最优性**: - 假设 \( S \) 是最优解,且 \( a_1 \) 是 \( S \) 中结束时间最早的活动。假设 \( S' \) 是通过贪心算法选择的活动集合,且 \( a_1' \) 是 \( S' \) 中结束时间最早的活动。由于 \( a_1 \) 是所有活动中结束时间最早的,因此 \( f_1 \leq f_1' \)。如果 \( a_1 \neq a_1' \),则可以将 \( a_1' \) 替换为 \( a_1 \),得到的解仍然是最优解。因此,贪心选择的最早结束时间活动是全局最优解的一部分。 #### 具体实现步骤: 1. 按结束时间对活动进行排序。 2. 初始化一个空的活动子集。 3. 选择第一个活动并将其加入子集。 4. 对于每个后续活动,如果其开始时间不早于上一个选择的活动的结束时间,则将其加入子集。 5. 重复步骤4,直到所有活动都被检查。 ```python def activity_selection(activities): # 按结束时间排序 sorted_activities = sorted(activities, key=lambda x: x[1]) # 初始化 selected = [sorted_activities[0]] last_end_time = sorted_activities[0][1] # 选择活动 for activity in sorted_activities[1:]: if activity[0] >= last_end_time: selected.append(activity) last_end_time = activity[1] return selected # 示例活动 (开始时间, 结束时间) activities = [(1, 4), (3, 5), (0, 6), (5, 7), (3, 9), (5, 9), (6, 10), (8, 11), (8, 12), (2, 13), (12, 14)] print(activity_selection(activities)) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

怪&

感谢您的支持

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

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

打赏作者

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

抵扣说明:

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

余额充值