银行家算法——安全性检查

#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
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞