盈利分配 方格计算

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 ;
	else
		continue ;
  }

  //   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 B C   
0 0 0 0   
1 3 5 4   
2 7 10 6   
3 9 11 11   
4 12 11 12   
5 13 11 12  
其中:第一列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;
}  


 



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值