|
吾爱游客
发表于 2017-11-18 21:11
1、申 请 I D:Kevin_Red
2、个人邮箱:609760471@qq.com
3、原创技术文章:
计算机专业本科生,喜爱编程
操作系统Dijkstra算法的java语言实现:
import java.util.Scanner;
public class Main {
//数据结构定义
public static int n,m; //n是进程个数,m是资源个数
public static int sum=0; //安全序列个数
public static int[] Available; //可利用资源向量
public static int[][] Max; //最大需求矩阵
public static int[][] Allocation; //分配情况矩阵
public static int[][] Need; //需求矩阵
public static boolean[] Finish; //状态向量
public static int[] Safe; //安全序列向量
public static int[] Work; //工作向量
public static int[] a; //全排列序列
public static int[] book; //标记数组
public static int sign=0; //标记变量
//全排列
public static void dfs(int step){
if(step==n+1){
if(safe()){
if(sum!=0&&sign==0){
System.out.println("SAFE");
sign=1;
}
System.out.printf("%2d : ",sum);
for(int i=1;i<=n;i++)
System.out.print(a+" ");
System.out.println();
}
return;
}
for(int i=1;i<=n;i++){
if(book==0){
book=1;
a[step]=i;
dfs(step+1);
book=0;
}
}
return;
}
//检测是否能够运行(Need<=Work)
public static boolean search(int p){
for(int i=1;i<=m;i++)
if(Need[p]>Work)
return false;
return true;
}
//安全性算法
public static boolean safe(){
Work=new int [m+1];
for(int i=1;i<=m;i++) //初始化工作向量
Work=Available;
for(int i=1;i<=n;i++)
Finish=false;
for(int i=1;i<=n;i++){
if(Finish[a]==false&&search(a)){
Finish[a]=true;
for(int j=1;j<=m;j++) //运行完毕释放资源
Work[j]+=Allocation[a][j];
}
else
return false;
}
sum++;
return true;
}
public static void main(String[] args){
Scanner input =new Scanner(System.in);
//数据结构初始化
n=input.nextInt();
m=input.nextInt();
int[] Request=new int[m+1];
Available=new int[m+1];
Max=new int[n+1][m+1];
Allocation=new int[n+1][m+1];
Need=new int[n+1][m+1];
Finish=new boolean[n+1];
a=new int[n+1];
book=new int[n+1];
//数据初始化
for(int i=1;i<=m;i++)
Available=input.nextInt();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
Allocation[j]=input.nextInt();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
Need[j]=input.nextInt();
for(int i=1;i<=m;i++)
Finish=false;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
Max[j]=Need[j]+Allocation[j];
//请求输入
int p=input.nextInt();
for(int i=1;i<=m;i++)
Request=input.nextInt();
//分配资源
boolean flag=true;
for(int i=1;i<=m;i++) //检测是否运行出错
if(Request>Available&&Request>Need[p]){
flag=false;
break;
}
if(flag){ //如果没有错试着分配
for(int i=1;i<=m;i++){
Available-=Request;
Need[p]-=Request;
Allocation[p]+=Request;
}
dfs(1); //寻找安全序列
}
if(sign==0)
System.out.print("UNSAFE");
}
}
双十一购物津贴最优解计算c语言版:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
int * book,* a,* waymax,* amax;
float * cny;
int num,max=0,mmax=0,flag=0;
void check(int * a){
int way[num+5];
float maxtemp=0;
int i=1,j=1;
while(i<=num){
while(maxtemp<400&&i<=num){
maxtemp+=cny[a[i++]];
}
if(maxtemp>=400)
way[j++]=i-1;
else
way[j-1]=i-1;
maxtemp=0;
}
j--;
if(j>=max){
max=j;
mmax=0;
for(i=1;i<=j;i++)
waymax=way;
for(i=1;i<=num;i++)
amax=a;
}
else
mmax++;
if(mmax==800)
flag=1;
}
void dfs(int step){
if(flag==1)
return;
if(step==num+1){
check(a);
return;
}
for(int i=1;i<=num;i++){
if(book==0){
book=1;
a[step]=i;
dfs(step+1);
book=0;
}
}
return;
}
int main(){
int i;
printf("请输入您购买商品的数量:");
scanf("%d",&num);
cny=(float *)malloc(sizeof(float)*(num+5));
book=(int *)malloc(sizeof(int)*(num+5));
a=(int *)malloc(sizeof(int)*(num+5));
amax=(int *)malloc(sizeof(int)*(num+5));
waymax=(int *)malloc(sizeof(int)*(num+5));
for(i=1;i<=num;i++){
printf("请输入第%d个商品的价格:",i);
scanf("%f",&cny);
}
for(int k=1;k<=num;k++)
book[k]=0;
dfs(1);
printf("最多可以减%d\n",max*50);
waymax[0]=0;
float sum=0;
for(i=1;i<=max;i++){
for(int j=waymax[i-1]+1;j<=waymax;j++){
printf("%d ",amax[j]);
sum+=cny[amax[j]];
}
printf("一起买,需要花费%.2f元\n",sum-50);
sum=0;
}
getchar();getchar();
return 0;
}
双十一红包分析:
#include<stdio.h>
int main(){
float a[400];
int t=1,j,i;
float n,temp,sum=0;
scanf("%f",&n); //变量输入
while(n>0){
a[t++]=n;
sum+=n;
scanf("%f",&n);
}
printf("您有%d个红包,总价值%.2f\n",t-1,sum);
for(i=1;i<t-1;i++) //排序
for(j=1;j<t-i;j++){
if(a[j]<a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
printf("其中:\n") ; //分析总数以及每个面额的数量
int count=0;
int k=1;
for(i=1;i<t;i++){
if(a>a[k]||a<a[k]){
printf("有%d个%.2f元的红包\n",count,a[k]);
count=0;
k=i;
count++;
}
else{
count++;
}
}
printf("有%d个%.2f元的红包\n",count,a[k]);
int order; //分析需要几个订单可以用完以及每个订单可用多少
(t-1)%10==0?order=(t-1)/10:order=((t-1)/10)+1;
printf("您需要%d笔订单可以使用所有红包\n",order);
printf("具体的:\n") ;
for(i=1;i<=order;i++){
sum=0;
for(j=i*10-9;j<=i*10&&j<t;j++)
sum+=a[j];
printf("第%d笔订单可以使用红包%.2f元\n",i,sum);
}
getchar();getchar();
return 0;
}
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|