#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
using namespace std;
int p_all[10][10] , p_max[10][10] , p_need[10][10] , ava[10] , tmp[10];
int n , m;
int xu[10];
bool flag[20];
void yu()
{
for(int i = 1 ; i <= m ; i++){
tmp[i] = ava[i];
}
}
//银行家回收分配资源
void work(int x)
{
for(int i = 1 ; i <= m ; i++){
tmp[i] += p_all[x][i];
}
}
//判断他能不能分配
bool useful(int x)
{
bool use = true;
for(int i = 1 ; i <= m ; i++){
if(tmp[i] < p_need[x][i]) {use = false;/*printf("i = %d tmp = %d need = %d \n",i , tmp[i] , p_need[x][i]);*/}
}
return use;
}
//不断的去递归银行家算法
void solve(int index)
{
if(index == n){
for(int i = 1 ; i <= n ; i++) printf("i = %d ",xu[i]);
printf("\n");
}else{
for(int i = 1 ; i <= n ; i++){
if(flag[i] == false && useful(i)){
flag[i] = true;
xu[index + 1] = i;
work(i);
solve(index + 1);
flag[i] = false;
//递归的很关键,就是你上一个用完之后,下一个就要给他释放一下
}
}
}
}
void solve_need()
{
for(int i = 1 ; i <= n ; i++){
for(int j = 1 ; j <= m ; j++){
p_need[i][j] = p_max[i][j] - p_all[i][j];
printf("%d ",p_need[i][j]);
}
printf("\n");
}
}
int main()
{
//n 个物品,m 个资源
scanf("%d %d",&n , &m);
for(int i = 1 ; i <= n ; i++){
for(int j = 1 ; j <= m ; j++){
scanf("%d",&p_all[i][j]);
}
}
for(int i = 1 ; i <= n ; i++){
for(int j = 1 ; j <= m ; j++){
scanf("%d",&p_max[i][j]);
}
}
solve_need();
for(int i = 1 ; i <= m ; i++) scanf("%d",&ava[i]);
yu();
for(int i = 1 ; i <= n ; i++){
yu();
memset(flag , 0 , sizeof(flag));
memset(xu , 0 , sizeof(xu));
if(useful(i)){
work(i);
flag[i] = true;
xu[1] = i;
solve(1);
}
}
return 0;
}
/* 先输入进程数量,资源数量 5个进程,三个资源 先输入 allocation数组 0 1 0 2 0 0 3 0 2 2 1 1 0 0 2 Max数组 7 5 3 3 2 2 9 0 2 2 2 2 4 3 3 avaliable数组 3 3 2 *
银行家算法——安全性检查
原文作者:银行家问题
原文地址: https://blog.csdn.net/zsd201531107026/article/details/80453553
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/zsd201531107026/article/details/80453553
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。