思路: 要求出安全排列,只需要枚举n各进程的每种全排列 枚举即可
1 全排列
//5 // 线程数
//3 / / 资源数
//2 3 3 // 初始可用资源
//已分配资源数:
//2 1 2
//4 0 2
//3 0 5
//2 0 4
//3 1 4
//资源需求数:
//3 4 7
//1 3 4
//0 0 3
//2 2 1
//1 1 0
解法 1
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
int n; //线程数
int sou; // 资源数;
const int N = 1e2+10;
int need[110][N];//需求个数
int alloc[110][N]; // 分配
int p[N]; //
int avail[N];
int all ;
void check(){
int *ava = avail;
int alloc_temp[110][110] ;
memcpy(alloc_temp,alloc,sizeof alloc);
for(int i=0;i<n;i++){
for(int j=0;j<sou;j++){
// printf("%d ",need[p[i]][j]);
if( ava[j]<need[p[i]][j]){
return;
}
}
for(int j=0;j<sou;j++){
ava[j]+= alloc_temp[p[i]][j] ;
}
}
for(int i=0;i<n;i++){
if(i!=n-1) printf("p%d--> ",p[i]+1);
else printf("p%d",p[i]+1);
}
all++;
cout<<endl;
return;
}
int main(){
cin>>n; //线程数
cin>>sou; // 资源数;
for(int i=0;i<sou;i++){
scanf("%d",avail+i);
}
printf("各线程已分配资源数:\n");
for(int i=0;i<n;i++){
for(int j=0;j<sou;j++){
scanf("%d",alloc[i]+j);
}
}
printf("各线程资源需求数:\n");
for(int i=0;i<n;i++){
for(int j=0;j<sou;j++){
scanf("%d",need[i]+j);
}
}
for(int i=0;i<N;i++){
p[i] = i;
}
check();
while(next_permutation(p,p+n)){ // c++求排列数的函数
check();
}
cout<<endl;
cout<<all<<endl;
return 0;
}
类似dfs方式暴搜 // 求全排列数
int dfs(int x){ // 求全排列数的另一种方法
if(x==n){
for(int i=0;i<n;i++){
printf("%d",p[i]);
}
return;
}
for(int i=0;i<n;i++){
if(!st[i]){
st[i] = true;
a[x] = i;
dfs(x+1);
st[i] = false;
}
}
}
解法 2
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
int n; //线程数
int sou; // 资源数;
const int N = 1e2+10;
int need[110][N];//需求个数
int alloc[110][N]; // 分配
int avail[N];
int v[N];
bool st[N];
int p[N];
void check(){
int *ava = avail;
for(int i=0;i<n;i++){
for(int j=0;j<sou;j++){
// printf("%d ",need[p[i]][j]);
if( avail[j]<need[p[i]][j]){
return;
}
}
for(int j=0;j<sou;j++){
ava[j]+= alloc[p[i]][j] ;
}
}
for(int i=0;i<n;i++){
if(i!=n-1) printf("p%d--> ",p[i]+1);
else printf("p%d",p[i]+1);
}
cout<<endl;
return;
}
void dfs(int x){ // 求全排列数的另一种方法 dfs
if(x==n){
check();
return ;
}
for(int i=0;i<n;i++){
if(!st[i]){
st[i] = true;
p[x] = i;
dfs(x+1);
st[i] = false;
}
}
}
int main(){
cin>>n; //线程数
cin>>sou; // 资源数;
for(int i=0;i<sou;i++){
scanf("%d",avail+i);
}
printf("各线程已分配资源数:\n");
for(int i=0;i<n;i++){
for(int j=0;j<sou;j++){
scanf("%d",alloc[i]+j);
}
}
printf("各线程资源需求数:\n");
for(int i=0;i<n;i++){
for(int j=0;j<sou;j++){
scanf("%d",need[i]+j);
}
}
dfs(0);
return 0;
}
//5
//5
//3
//2 3 3
//已分配资源数:
//2 1 2
//4 0 2
//3 0 5
//2 0 4
//3 1 4
//资源需求数:
//3 4 7
//1 3 4
//0 0 3
//2 2 1
//1 1 0
先进先出 -- 思路 : 简单模拟
// 先进先出
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100;// 最大进程数
int n; // 进程数
struct Pg{
string name;
int arrive, se_time, pri;
bool operator< (Pg& e)const{
return e.arrive>arrive;
}
}pg[N];
//
struct Ans{
double sta,end,turn, right_time;
}ans[N],ans2[N];
int main(){
printf("请输入进程数:\n");
cin>>n;
printf("请输入各进程的 进程名, 开始时间 , 服务时间 , 优先级 :\n ");
for(int i=0;i<n;i++){
cin>>pg[i].name>>pg[i].arrive>>pg[i].se_time>>pg[i].pri;
}
sort(pg,pg+n);
printf("进程名 到达时间 优先级 开始时间 结束时间 中转时间 带权周转时间 :");
int sta_time = 0, end_time = 0;
for(int i=0;i<n;i++){
if(!i){
ans[i].sta = pg[i].arrive;
}else{
ans[i].sta = pg[i].arrive>ans[i-1].end?pg[i].arrive:ans[i-1].end;
}
ans[i].end = ans[i].sta+pg[i].se_time;
ans[i].turn = ans[i].end - pg[i].arrive;
ans[i].right_time = ans[i].turn/pg[i].se_time;
cout<<endl;
cout<<pg[i].name<<" ";
printf("%d %d %d %.2lf %.2lf %.2lf %.2lf \n",pg[i].arrive,pg[i].se_time,pg[i].pri,ans[i].sta,ans[i].end,ans[i].turn,ans[i].right_time );
}
return 0;
}
/*
p1 25 30 2
p2 15 20 1
p3 5 50 3
p4 45 35 5
p5 60 25 4
*/