13题:
题目:
在一个n*m的方格中,m为奇数,放置有n*m个数,如图4-17所示。方格中间下方有一个人,此人可以按照5个方向前进但不能越出方格,如图4-18所示。
图 4-17 方格
人每走过一个方格必须取此方格中的数。要求找到一条从底到顶的路径,使其数相加之和为最大。输出最大和的值。
设计思想:通过根据导数第一排的数据和行走方式,倒推出导数第二排的最大可能行走结果,依次类推,循环查找,直到第一排数据。再根据行人坐在位置和行走方向,找到五个方向中最大一个值。反向递推,找到行走路径。
效果截图:
代码:
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所需要的台数。
效果截图:
代码:
题目:
在一个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;
}