现代谜题:四个(N个)人过桥问题;

过桥问题

问题描述:晚上有四个人要过桥,只有一个手电筒,每次过桥都需要手电筒,每次最多可同时过两个人,其中甲过桥要1分钟,乙要2分钟,丙要5分钟,丁要10分钟。求最短的过桥时间。

对于这个问题:我们可以引申到一个人,二个人,三个人至N个人过桥的问题上;

  1. 当一个人过桥时 那么直接过桥就行了 这很简单
  2. 当两个人过桥时,也是直接过桥 时间 = 走路最慢的那个人的时间;
  3. 当三个人过桥的时候 ,我们可以穷举三个人过桥的可能性,发现 总共花费的最短时间 = 三个人的过桥时间和
  4. 当四个人过桥的时候 过桥的时间最短有两种模式:
    - 模式一 :让速度最快的人 依次带速度最慢的人和速度次慢的人 过桥
    - 模式二 :让速度最快的人和速度次快的人带速度最慢的人和速度次慢的人过桥
    假设 :A : 速度最快 B :速度次快 C:速度次慢 D:速度最慢
    模式二: times = time1+2+3+4;
    a,b —> a,b time1
    a <— a time2
    z,y —> z,y time3
    b <— b time4
    然后用递归的思想求解出N个人过桥的最短时间
int shortT(int arr[],int n){
	int end = n; 
	int times = 0;
	if(1 == n) return arr[n-1];
	if(2 == n) return arr[n-1];
	if(3 == n) return arr[0]+arr[1]+arr[2];
	if(n >= 4){
		int a = arr[0],	
			b = arr[1], 
			z = arr[n-1],
			y = arr[n-2];
		if(2*a+z+y > 2*b+a+z){
			times = 2*b+a+z;
			end = end - 2;
		}else{
			times = 2*a+z+y;
			end = end - 2;
		}
		times = times + shortT(arr,end);
		return times;
	}
}

上述提到的模式一,模式二参考下面链接

参考链接:http://www.360doc.com/content/08/0706/02/37063_1402145.shtml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值