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

#include 
#include 
#include 
#include 
#include 

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
*

你可能感兴趣的:(dfs)