贪心算法相关代码

贪心算法
1.贪心算法步骤:
(1)排序(按照要贪的东西排)
(2)开始贪(随时检查问题约束)
(3)贪完应该返回问题的解(记录最优解)
2.贪心算法的基本要素
(1)贪心选择性质
(2)最优子结构性质
3.贪心算法的证明
(1)贪心的性质决定了第一次贪一个最大的或最小的是能够导致某个最优解的。第一次贪心是可以的
(2)最优子结构,后续可以一直贪。贪完第一次后,问题规模缩小,但问题依然是一个可以贪心的最优解问题。
4.例子
最优装载问题
背包负重问题(贪单价,让单位背包载重的价值最大化原则【物品可分割】)
0—1背包问题(物品不可分割,无法用贪心算法)
活动安排问题(贪结束时间,以期望能留下最大的连续空间)
以最优装载为例:(c语言)

#include<stdlib.h>
#include<time.h>
#include<stdio.h>
const int N=10;
struct box{ 
	int No;//编号 
	int w;//重量 
};
void selectsort(box b[]){//选择排序 
	for(int i=0;i<N;i++)
		for(int j=i;j<N;j++)
			if(b[i].w>b[j].w){//应该按什么排序? 
				box x;//利用临时变量x交换b[i]和b[j] 
				x=b[i];
				b[i]=b[j];
				b[j]=x;
			}
} 
int greedy(box b[],int c)
{
	selectsort(b);
	int count=0;
	for(int i=0;i<N;i++){
		if(b[i].w<=c){
			c=c-b[i].w;
			count++; 
			printf("集装箱%d,重量%d,可以上船,轮船载重还剩%d,装了%d个箱子了\n",b[i].No,b[i].w,c,count);
		}else{
			printf("集装箱%d,重量%d,实在装不下了",b[i].No,b[i].w);
			return count; 
		} 
		
	}
	//先装哪个集装箱?什么时候就不能装了?怎么记录集装箱数量?
	//先排序,以此装船,判断是否超重,如果超重,就不装了,返回已装箱子的数量 
	return count; 
}
int main()
{
	//srand((unsigned)time(NULL));
	int c=rand()%50;//初始化轮船载重量 
	printf("轮船最大装载重量:%d吨\n",c);
	box b[N];//集装箱数组 
	for(int i=0;i<N;i++)//初始化集装箱数据 
	{
		b[i].No=i;
		b[i].w=rand()%10+1;
		printf("集装箱%d,重量%d吨\n",b[i].No,b[i].w);
	}
	printf("最多可装载%d个集装箱\n",greedy(b,c));
	return 0; 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、实验目的: 掌握分页式存储管理的基本概念和实现方法。要求编写一个模拟的分页式管理程序, 并能对分页式存储的页面置换算法进行编写和计算各个算法的缺页率。 二、程序设计: 假定一个能够存放M个页面的内存,当发生缺页时,调入一个页面, 通过LRU算法求出应该置换出的页面号。输入一连串的页面号, 程序自动选择调出的页面并计算缺页率。 设计页面置换算法,这里采用最近最久未使用置换算法LRU。 LRU算法的实现要归功于一个8位的寄存器的实现。 三、算法说明: 执行程序时,当主存没有可用页面时,为了选择淘汰主存中的哪一页面, 腾出1个空闲块以便存放新调入的页面。淘汰哪个页面的首要问题是选择何种置换算法。 该程序采用LRU方法选择,依置换策略选择一个可置换的页面并计算它们的缺页率以便比较。 */ #include<iostream> using namespace std; #define M 3 #include<math.h> int reg[2][M]; int count; int num; int N; /********初始化函数,数组reg[0][i]存放页面号,初始化为-1,reg[1][i]当作寄存器, 初始化为0*********/ void init() { int i,count=0;num=0; N=(int)pow(2,7); /********二进制数10000000**********/ for(i=0;i<M;i++) { reg[0][i]=-1; reg[1][i]=0; } } /*********寻找数组a中的最小值,返回最小值对应的下标***********/ int min(int a[]) { int i,index=0; int min=a[0]; for(i=1;i<M;i++) { if(min>a[i]) { min=a[i]; index=i; } } return index; } /***判断页面号x是否在数组中,如果在,返回对应的下标;否则返回-1***/ int isIn(int x,int a[]){ int i; int index=-1; for(i=0;i<M;i++) { if(a[i]==x) { index=i; break; } } return index; } /**********判断虚拟的内存中是否已经存满了页面,如果满了,则返回-1, 没有满则返回找到空的对应的第一个下标**************/ int isFull(int a[]) { int i,index=-1; for(i=0;i<M;i++) { if(a[i]==-1) { index=i; break; } } return index; } /*************页面置换方法*****************/ void swap(int x) { int i,k,temp,temp0,count; int index=isIn(x,reg[0]); /****判断x是否在reg[0]数组中*******/ if(index!=-1) { reg[1][index]=reg[1][index]^N; }/**reg[1][index]异或二进制数10000000**/ else{ temp=isFull(reg[0]); if(temp!=-1) /*******内存没有满,直接调入页面************/ { reg[0][temp]=x; reg[1][temp]=reg[1][temp]^N; } else if(temp==-1) { k=min(reg[1]); /**置换出寄存器中数值最小的对应的下标的页面***/ temp0=reg[0][k]; /*********临时保留要换出的页面号*****/ reg[0][k]=x; reg[1][k]=reg[1][k]^N; printf("the page %d is exchanged out!\n",temp0); /******打印要置换出的页号**************/ count++; /*********置换次数加1**************/ } } for(i=0;i<M;i++) { reg[1][i]=reg[1][i]>>1; }/********寄存器中的所有数右移一位*****/ /***************打印缺页数和缺页率**********************/ printf("the count of Exchanged is: %d \n",count); printf("the rate of exchanged is: %f\n",count*1.0/num); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值