乘船问题(贪心算法+迭代求解)
问题描述:有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;
}