beibao.c
上传用户:hhyinxing
上传日期:2013-09-10
资源大小:833k
文件大小:3k
源码类别:

并行计算

开发平台:

Unix_Linux

  1. #include "math.h"
  2. #include "mpi.h"
  3. main ( argc, argv )
  4. int argc;
  5. char * argv[];
  6.   MPI_Status status;
  7.   
  8.   int i, j, m, tmp, ww, group_size, my_rank, pnumber, c, wb,
  9.       pb;  /* to store number of used slave processors */
  10.   int group_size1; /* number of rank*/
  11.   int p[100] , w[100], z[100], f[100][100];
  12.   
  13.   MPI_Init ( &argc , &argv );/* Initialze MPI. */
  14.   MPI_Comm_size ( MPI_COMM_WORLD , &group_size1 );/* Get the number of rank. */
  15.   MPI_Comm_rank ( MPI_COMM_WORLD , &my_rank );  /* get id of rank*/
  16.   
  17.   /*if the number of slave processor is less than 2,Abort!*/
  18.   if ( group_size1 < 3 ) 
  19.   {
  20.       printf ( "not enough processor!n" );
  21.       MPI_Abort ( MPI_COMM_WORLD,99 );
  22.   }
  23.   pnumber=group_size1-1;
  24.   
  25.   /*主进程:输入数组,输出结果*/
  26.   if(my_rank == 0)
  27.   {
  28.       printf ( "my_rank %dn" , my_rank );
  29.     
  30.       printf ( "knapscack of capacity = %dn", pnumber);
  31.     
  32.       printf ( "Enter number of values:n");
  33.       scanf( "%d",&m);
  34.       for(i=1;i<=pnumber;i++)
  35.       {
  36.           MPI_Send(&m,1,MPI_INT,i,i,MPI_COMM_WORLD);
  37.       }
  38.     
  39.       printf("please input p:n");
  40.       for(i = 1;i <= m ; i++ )
  41.       {
  42.   scanf( "%d" , &p[i] );
  43.       }
  44.       for(i=1;i<=pnumber;i++)
  45.       {
  46.           MPI_Send(&p[1],m,MPI_INT,i,i,MPI_COMM_WORLD);
  47.       }
  48.       printf("please input w:n");
  49.       for(i =1; i<=m;i++)
  50.       {
  51.   scanf("%d",&w[i]);
  52.       }
  53.       for(i=1;i<=pnumber;i++)
  54.       {
  55.           MPI_Send(&w[1],m,MPI_INT,i,i,MPI_COMM_WORLD);
  56.       }
  57.      
  58.   }
  59.   
  60.   /* 根据主进程传来的数据,计算,得出结果*/
  61.   else
  62.   {
  63.       printf(" my rank is %dn",my_rank);
  64.      
  65.       MPI_Recv(&m,1,MPI_INT,0,my_rank,MPI_COMM_WORLD,&status);
  66.       MPI_Recv(&p[1],m,MPI_INT,0,my_rank,MPI_COMM_WORLD,&status);
  67.       MPI_Recv(&w[1],m,MPI_INT,0,my_rank,MPI_COMM_WORLD,&status);
  68.   
  69.       c=pnumber;
  70.       for(i=0;i<=c;i++)
  71.       {
  72.   f[0][i]=0;
  73.       }
  74.       for(i=1;i<=m;i++)
  75.       {
  76.     f[i][0]=0;
  77.       }
  78.       for(i=1;i<=m;i++)
  79.       {
  80.  if(i>1)
  81.  {
  82.          for(j=1;j<=pnumber;j++)
  83.     {
  84.                MPI_Recv(&f[i-1][j],1,MPI_INT,j,(i-1)*10+j,MPI_COMM_WORLD,&status);
  85.            }
  86.   }
  87.          if(my_rank<w[i]) 
  88.     f[i][my_rank]=f[i-1][my_rank];
  89.          if(my_rank>=w[i] && my_rank<=c)
  90.  {
  91.     ww=w[i];
  92.     tmp=f[i-1][my_rank-ww]+p[i];
  93.     if(f[i-1][my_rank]>tmp)
  94.         f[i][my_rank]=f[i-1][my_rank];
  95.             else f[i][my_rank]=tmp;
  96.   }
  97.          
  98.  if(i<m)
  99.  {
  100.     for(j=1;j<=pnumber;j++)
  101.     {
  102.                 MPI_Send(&f[i][my_rank],1,MPI_INT,j,i*10+my_rank,MPI_COMM_WORLD);
  103.             }
  104.          }
  105.        }
  106.   
  107.   /* tracing backward to find the solution*/
  108.   wb=c;
  109.   pb=f[m][c];
  110.   for(i=m;i>=1;i--)
  111.   {
  112.   if(f[i-1][wb]==pb)
  113.   {
  114.   z[i]=0;
  115.   }
  116.   else
  117.   {
  118.   z[i]=1;
  119.   pb=pb-p[i];
  120.   wb=wb-w[i];
  121.   }
  122.   }
  123.   if(my_rank==c)
  124.   {
  125.           printf(" the result:n");
  126.        for(i=1;i<=m;i++)
  127.    {
  128.       printf("z %d:%dn",i,z[i]);
  129.    }
  130.   }
  131.   }
  132.   MPI_Finalize();
  133. }