【问题描述】
有n个人,第i个人的重量为wi,每艘船的最大载重量为c;且每个船最多只能乘坐两个人,用最少的船装载所有的人。
【分析】
选择最轻的人,让最重的人和他乘同一个船(贪心);
如果这两个人的总重量不超过最大载重量,则一起乘船(i++,j--,num++);
若两个人总重量超过最大载重量,则让最重的人独自乘船(j--,num++);
应先将这些人的重量由小到大排序(sort函数)。
【代码】
#include <stdio.h>
#include <algorithm>
using namespace std;
main(){
int num=0;
int c,n;
int w[1000];
printf("请输入人数(不为0):");
scanf("%d",&n) ;
printf("请输入船的最大载重量:");
scanf("%d",&c);
for(int i=0;i<n;i++){
printf("请输入第%d人的重量:",i+1) ;
scanf("%d",&w[i]);
}
sort(w,w+n); //将重量由小到大排列
int i=0,j=n-1;
while(i<j){
if(w[i]+w[j]<=c){ //如果两个人重量和小于船,则上船
i++;
j--;
num++;
}
else{
if(w[j]<c){ //如果两个人重量和大于船,则让重量大的独自乘船
j--;
num++;
}
else j--; //如果重量大的那个人比船还要重,则不乘船
}
}
if(i==j&&w[i]<=c){ //最后一个人 乘船
num++;
}
printf("最少需要的船数为:%d",num) ;
}