万物皆数——让CS给数学加上翅膀!

万物皆数——让CS给数学加上翅膀!

今天,小表妹儿发给我一道奥数题,题目如下:
一个教授、一个助教、一个数字设计专业的学生和一个新生需要在黑夜里经过一座摇摇晃晃的桥。这座桥很不稳固,每次只能有两个人通过。他们只有一把火炬,而且桥的跨度太大无法把火炬扔回来,因此必须有人要把火炬拿回来。新生过桥需要1分钟,数字设计专业的学生过桥需要2分钟,助教过桥需要5分钟,教授过桥需要10分钟。所有人都通过此桥的最短时间是多少?
在这里插入图片描述
看到此题,可能有人会想:“让最快的新生来回接人不就好了!”让我们来算一算:
2+1+5+1+10=19(分钟)
那么,最优解真是如此吗???
最优解调试台
看来事实并非如此!!!源代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include

using namespace std;

int N = 4;
int t[10] = { 1,2,5,10 };

int search(int torch, int passedNum, int passed[])
{
if (torch && passedNum == N)return 0;
int T = 0x7f7f7f7f;//表示一个很大的数,十六进制。
if (!torch)
{
for (int i = 0; i < N; i++)
{
for (int j = i + 1; j < N; j++)
{
if (!passed[i] && !passed[j])
{
passed[i] = passed[j] = 1;
T = min(T, search(1, passedNum + 2, passed) + max(t[i], t[j]));
passed[i] = passed[j] = 0;
}
}
}
}
else
{
for (int i = 0; i < N; i++)
{
if (passed[i])
{
passed[i] = 0;
T = min(T, search(0, passedNum - 1, passed) + t[i]);
passed[i] = 1;
}
}
}
return T;
}

int main()
{
int passed[10] = { 0 };
int answer = search(0, 0, passed);
printf(“所有人都通过此桥的最短时间是%d分钟\n”, answer);
return 0;
}
最优解穷举算法代码
现在,可能你会很好奇,这17分钟的最优解是怎么来的?那么,还是让计算机来告诉我们吧(结果会让你大吃一惊的!
数组t的0、1、2、3分别代表过桥用时1、2、5、10分钟的四个人,那么,结果如下:
最优解对应的过桥方式
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include

using namespace std;

int N = 4;
int t[10] = { 1,2,5,10 };
struct j
{
int laiqu;
int a, b;
}jilu[100];

void shuchu(int cengshu)
{
for (int i = 0; i < cengshu; i++)
{
if (jilu[i].laiqu)printf("%d回来\n", jilu[i].a);
else printf("%d和%d过去\n", jilu[i].a, jilu[i].b);
}
printf("-------------------------------\n");
}

int search(int torch, int passedNum, int passed[], int time, int ceng)
{
if (torch && passedNum == N)
{
if (time == 17)shuchu(ceng);
return time;
}
int T = 0x7f7f7f7f;
if (!torch)
{
for (int i = 0; i < N; i++)
{
for (int j = i + 1; j < N; j++)
{
if (!passed[i] && !passed[j])
{
jilu[ceng].laiqu = 0;
jilu[ceng].a = i;
jilu[ceng].b = j;
passed[i] = passed[j] = 1;
T = min(T, search(1, passedNum + 2, passed, time + max(t[i], t[j]), ceng + 1));
passed[i] = passed[j] = 0;
}
}
}
}
else
{
for (int i = 0; i < N; i++)
{
if (passed[i])
{
jilu[ceng].laiqu = 1;
jilu[ceng].a = i;
passed[i] = 0;
T = min(T, search(0, passedNum - 1, passed, time + t[i], ceng + 1));
passed[i] = 1;
}
}
}
return T;
}

int main()
{
int passed[10] = { 0 };
int answer = search(0, 0, passed, 0, 0);
printf(“所有人都通过此桥的最短时间是%d分钟\n”, answer);
return 0;
}
过桥方法代码
由此可见,该题没那么简单~
当一个人作为管理者仅仅需要管理四个人从而求得最优解尚且会头脑发热浪费两分钟,那么面对大量的对象需要管理时,计算机的用处自然显现出来。当数学问题(即算法)解决了,计算机就会帮助人们做出最优的决策,从而有效提升社会生产水平,极大便捷人类生活!
最后放一张小鲨鱼,希望自己事事顺心,程序猿伙伴们一切顺利!
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值