操作系统 银行家算法

谁知道对不对 反正看着挺像的

试了一下过程考核的题 好像是挺像的

 

  1 #include<bits/stdc++.h>
  2 #define cl(a,b) memset(a,b,sizeof(a))
  3 using namespace std;
  4 
  5 const int maxn=1e3+10;
  6 
  7 int n,m;
  8 int ans[maxn],tmp[maxn];
  9 int available[maxn];
 10 int need[maxn][maxn];
 11 int allocation[maxn][maxn];
 12 bool ok,vis[maxn];
 13 
 14 void init()
 15 {
 16     ok=false;
 17     cl(vis,false);
 18     cl(ans,0),cl(tmp,0);
 19     cl(available,0);
 20     cl(need,0);
 21     cl(allocation,0);
 22 }
 23 
 24 bool cmp(int now)
 25 {
 26     int tmp[maxn];
 27     for(int i=0; i<m; i++)
 28     {
 29         tmp[i]=(available[i]+allocation[now][i]);
 30     }
 31     for(int i=0; i<m; i++)
 32     {
 33         if(tmp[i] < need[now][i]) return false;
 34     }
 35     return true;
 36 }
 37 
 38 void add(int now)
 39 {
 40     for(int i=0; i<m; i++)
 41     {
 42         available[i]+=allocation[now][i];
 43     }
 44 }
 45 
 46 void div(int now)
 47 {
 48     for(int i=0; i<m; i++)
 49     {
 50         available[i]-=allocation[now][i];
 51     }
 52 }
 53 
 54 void read(int a[][maxn])
 55 {
 56     for(int i=0; i<n; i++)
 57     {
 58         for(int j=0; j<m; j++)
 59         {
 60             scanf("%d",&a[i][j]);
 61         }
 62     }
 63 }
 64 
 65 void read(int a[])
 66 {
 67     for(int i=0; i<m; i++)
 68     {
 69         scanf("%d",&a[i]);
 70     }
 71 }
 72 
 73 void print(int a[])
 74 {
 75     for(int i=0; i<n; i++)
 76     {
 77         printf("%d%c",a[i],i==n-1?'\n':' ');
 78     }
 79 }
 80 
 81 void print(int a[][maxn])
 82 {
 83     for(int i=0; i<n; i++)
 84     {
 85         for(int j=0; j<m; j++)
 86         {
 87             printf("%d%c",a[i][j],j==m-1?'\n':' ');
 88         }
 89     }
 90 }
 91 
 92 void check(int now)
 93 {
 94     if(now==n)
 95     {
 96         ok=true;
 97         for(int i=0; i<n; i++)
 98         {
 99             ans[i]=tmp[i];
100         }
101         return ;
102     }
103     for(int i=0; i<n; i++)
104     {
105         if(!vis[i]&&cmp(i))
106         {
107             tmp[n-now-1]=i+1;
108             add(i);
109             vis[i]=true;
110             check(now+1);
111             vis[i]=false;
112             div(i);
113         }
114     }
115     return ;
116 }
117 
118 int main()
119 {
120     init();
121 //    freopen("in.txt","r",stdin);
122     scanf("%d%d",&n,&m);
123     read(need);
124     read(allocation);
125     read(available);
126     check(0);
127     if(ok)
128     {
129         printf("OK!\n");
130         print(ans);
131     }
132     else
133     {
134         printf("Can't!\n");
135     }
136     return 0;
137 }/*
138 
139 5 4
140 
141 0 0 1 2
142 1 7 5 0
143 2 3 5 6
144 0 6 5 2
145 0 6 5 6
146 
147 0 0 3 2
148 1 0 0 0
149 1 3 5 4
150 0 3 3 2
151 0 0 1 4
152 
153 1 6 2 2
154 
155 */

 

posted @ 2017-06-14 17:51  良将ℓ  阅读(229)  评论(0编辑  收藏  举报