盈利分配 方格计算

来源:互联网 发布:淘宝怎么打电子发票 编辑:程序博客网 时间:2024/04/30 15:00
13题:   
题目: 
在一个n*m的方格中,m为奇数,放置有n*m个数,如图4-17所示。方格中间下方有一个人,此人可以按照5个方向前进但不能越出方格,如图4-18所示。
              
                           图 4-17 方格     
人每走过一个方格必须取此方格中的数。要求找到一条从底到顶的路径,使其数相加之和为最大。输出最大和的值。


设计思想:通过根据导数第一排的数据和行走方式,倒推出导数第二排的最大可能行走结果,依次类推,循环查找,直到第一排数据。再根据行人坐在位置和行走方向,找到五个方向中最大一个值。反向递推,找到行走路径。


效果截图:


代码:
  
/*设计思想:通过根据导数第一排的数据和行走方式,倒推出导数第二排的最大可能行走结果,依次类推,循环查找,直到第一排数据。再根据行人坐在位置和行走方向,找到五个方向中最大一个值。反向递推,找到行走路径。*/#include<stdio.h>int a[6][7] = {{16 , 4 , 3 ,12 ,6, 0 ,3},{4 , -5 , 6 , 7 , 0 , 0 , 2},{6 ,0 , -1 , -2, 3, 6 ,8},{5 , 3, 4 ,0 , 0 , -2 , 7},{-1 , 7 , 4 , 0 , 7 , -5 , 6},{0 ,-1 , 3 , 4 , 12 , 4 , 2}};int findpath(int a[6][7] , int n , int m , int &item );int main(void){  int n = 6;  int m = 7;  int b[6][7] ;/*  for(int i = 0 ; i < 6 ; i++)  {       for(int j = 0 ; j < 7 ;j++)   {         b[i][j] = a[i][j] ; printf("%d\t",b[i][j]);   }   printf("\n");  }*/  //printf("-----------------------------------------------\n");    int item ;  int best = findpath( a , n , m , item );  printf("最大值是:%d\n",best);   //int k = item ;  //printf("path:\n");  //printf("%d   %d\n",n-1 , item);  printf("the path is:");  for(int i = n-2 ; i >= 0 ; i-- )  {     printf("(%d,%d) --> ",i+1 , item);  best = best-b[i+1][item]; for(int j = item-2 ; j <= item+2 ; j++) {     if(j < 0)             continue ; if(j >= m) continue; if(a[i][j] == best) {    item = j ;break; } }  }  printf("(%d  %d)\n",i+1 , item);   return 0;}int findpath(int a[6][7] , int n , int m ,int &item ){   int best ;  for(int i = 1 ; i < n; i++)  {     for(int j = 0 ; j < m ; j++) {    best = -10;       for(int k = j-2 ; k <= j+2 ; k++) {     if(k < 0) {    continue ; } else if( k >= m) {    break; } else {   if(a[i-1][k] > best)   {       best = a[i-1][k];   } } } a[i][j] = a[i][j] + best ; }    }     int k = m/2 - 2 ;  for( int j = m/2 - 1 ; j <= m/2 + 2 ; j++)  {    if(a[n-1][k] < a[n-1][j])k = j ;elsecontinue ;  }  //   printf("%d\n",a[n-1][k]);/*  for(i = 0 ; i < n; i++)  {     for(int j = 0 ; j < m ; j++) {    printf("%d\t",a[i][j]); } printf("\n");  } */    item = k;    return  a[n-1][k];  }







14题:   
题目:某工业生产部门根据国家计划的安排,拟将某种高效率的5台机器,分配给所属的A、B、C3个工厂,各个工厂的获得这种机器后,可以为国家盈利如表所示,问:这4台机器如何分配给各个工厂,才能是国家盈利最大?
                           盈利表
 
S A BC  
0 0 00  
1 3 54  
2 7 106  
3 9 1111  
4 12 1112  
5 13 1112 
其中:第一列S为机器台数,A、B、C列为3个工厂在拥有不同台数的机器时的盈利值。


设计思想:设计A[6]  B[6]  C[6]三个数组,分别存储对应盈利值。先求出n个机器在A、B分布的最佳盈利情况,并用AB[6]保存,再求出ABC[6]最佳的赢利情况。并分别算出对应的A、B、C所需要的台数。


效果截图:


代码:
 
<pre name="code" class="cpp">#include<stdio.h>int main(void){int A[6] = {0, 3, 7, 9, 12, 13};int B[6] = {0, 5, 10, 11, 11 ,11};int C[6] = {0 , 4 , 6 ,11 , 12 , 12};    int AB[6] = {0} ;int ABC[6] = {0} ;int sign[2][6] = {0};for(int i = 0 ; i < 6 ; i++){    int best = 0;  for(int j = 0 ; j < i ; j++)  {    if(best < (A[j] + B[i-j])){best = A[j] + B[i-j] ;sign[0][i] = j;}    AB[i] = best ;  } // printf("%d   %d\n",sign[0][i] , AB[i] );}  //printf("-------------------------------------------------\n");   for(i = 0 ; i < 6 ; i++){    int best = 0;  for(int j = 0 ; j < i ; j++)  {    if(best < (AB[j] + C[i-j])){best = AB[j] + C[i-j] ;sign[1][i] = j;}    ABC[i] = best ;  }  //printf("%d   %d\n",sign[1][i] , ABC[i] );}     printf("the max profit is %d\n",ABC[5]);   printf("need A is %d\n",sign[0][sign[1][5]]);   printf("need B is %d\n",sign[1][5]-sign[0][sign[1][5]]);   printf("need C is %d\n",5-sign[1][5]);   //printf("")       return 0;}  





0 0
原创粉丝点击