银行家算法 +

#include <iostream>
using namespace std;
#define N 5 //进程个数 
#define M 4	//资源种类数 
//银行家算法
int Allocation[N][M]={3,0,1,1,0,1,0,0,1,1,1,0,1,1,0,1,0,0,0,0};
int Max[N][M]       ={4,1,1,1,0,2,1,2,4,2,1,0,1,1,1,1,2,1,1,0};
int Total[M]        ={6,3,4,2};//已知的三种向量

int Work[M];
int Need[N][M];
int Available[M];
bool Finish[N]; 
void Initialize()
{
	int i,j;
	for(i=0;i<N;i++)
		for(j=0;j<M;j++)
			Need[i][j]=Max[i][j]-Allocation[i][j];		
	for(i=0;i<M;i++)
		Available[i]=Total[i];		
	for(i=0;i<N;i++)
		for(j=0;j<M;j++)
			Available[j]=Available[j]-Allocation[i][j];	
	for(i=0;i<M;i++)
		Work[i]=Available[i];			
	for(i=0;i<N;i++)
		Finish[i]=false;	
}
bool Issafe(int safe[])//判断一个序列是否安全
{
	for(int i=0;i<N;i++)
	{	
		for(int j=0;j<M;j++)
			if(Need[ safe[i]][j] >Work[j] )
				return false;
		for(int xx=0;xx<M;xx++)
			Work[xx]+=Allocation[safe[i]][xx];	
	}
	return true;			
} 
int count=0;
void bank(int safe[],int k,int n)//类似全排列算法perm() 
{
	int i;	
	if(k+1==n)
	{
		Initialize();
		if(Issafe(safe))
		{
			count++;
			for(i=0;i<n;i++)
			{
				cout<<"p"<<safe[i]+1;
				if(i!=n-1)
					cout<<" - "; 
			}
			cout<<endl;	
		}
	}
	else
	{
		for(i=k;i<n;i++)
		{
			swap(safe[i],safe[k]);
			bank(safe,k+1,n);
			swap(safe[i],safe[k]);
		}
	}
}
int main()
{
	int s[N];//用于存放安全序列的 
	for(int i=0;i<N;i++)
		s[i]=i;
	cout<<"此时系统存在安全序列:"<<endl;
	bank(s,0,N);	
	cout<<"所有可能的序列共有:"<<count<<"条"<<endl; 
	if(count==0)
		cout<<"以上结论作废"<<endl<<"因为找到0条也就对应找不到安全序列";
	return 0;
}

运行:

此时系统存在安全序列:
p4 - p1 - p3 - p2 - p5
p4 - p1 - p3 - p5 - p2
p4 - p1 - p2 - p3 - p5
p4 - p1 - p2 - p5 - p3
p4 - p1 - p5 - p2 - p3
p4 - p1 - p5 - p3 - p2
p4 - p5 - p1 - p3 - p2
p4 - p5 - p1 - p2 - p3
所有可能的序列共有:8条

--------------------------------
Process exited with return value 0
Press any key to continue . . .
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

todaycode

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

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

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

打赏作者

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

抵扣说明:

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

余额充值