乘船问题(贪心算法+迭代求解)

  问题描述:有n个人,第i个人的重量是Wi。每艘船的最大载重均为C,且最多容纳两个人,用最少的船装载所有人。

#include <iostream>
#include
<ctime>
#include
<algorithm>
using namespace std;
#define N 20 //人数
#define C 120 //船的承重
static int bcount=0;

void boat_num(int weight[],int left,int right)
{
int first,j;
for(int i=0;i<=right;i++)
{
first
=weight[i]; //第一个人的重量
for(j=i+1;j<=right;j++)
if(weight[j]>C-first) //如果第j个人的重量加上第一个人的重量大于C,那么第j个人和他后面的人都必须一个人一只船
{
cout
<<"从第"
<<j
<<""
<<right
<<"的人需要独自乘船 ";
bcount
+=right-j+1; //计算一个人一只船的人数
cout<<bcount<<endl;
break;
}
cout
<<"" //第j-1个人和第一个人的重量之和是可承受范围的最大值,符合贪心算法
<<i
<<"个人和第"
<<j-1
<<"个人同船 ";
bcount
++;
cout
<<bcount<<endl;

right
=j-2; //将right置为j-2,进行下次迭代。
}
}

int main()
{
int weight[N];
srand((unsigned)time(NULL));
for(int i=0;i<N;i++)
weight[i]
=40+rand()%60;

sort(weight,weight
+N); //将人的重量从小到大排好序
for(i=0;i<N;i++)
{
if(i>0 && 0==i%10)
cout
<<endl;
cout
<<weight[i]<<" ";
}
cout
<<endl;

boat_num(weight,
0,N-1); //求需要的船数

cout
<<"一共需要"
<<bcount
<<"条船"<<endl;
return 0;
}

 

posted @ 2010-07-18 10:09  忧国忧铭  Views(3329)  Comments(0)    收藏  举报