贪心算法--乘船问题
描述:
有n个人,第i个人的重量为wi,每艘船的最大载重量为c;且最多只能成两个人,用最少的船装载所有的人;
思路:
选择最轻的人i,他应该选择能和他做一艘船的最重的一个人j一起坐船。这种方法是贪心的。那么我们用两个下标i和j,来表示当前最轻和最重的人
如果重量和超过了容量,让j一个人坐船,j --。
如果没超,让i和j做一艘船。i ++,j --。
所以我们采用双指针和贪心来解决这道题目。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,c;
int w[1000];
cin>>n>>c;
for (int i=0;i<n;i++)
{
cin>>w[i];
}
sort(w,w+n);
int i=0,j=n-1;
int sum = 0;
while(i<j)
{
if(w[i] + w[j] <=c)
{
printf("+++%4d %4d\n",w[i],w[j]);
sum++;
i++;j--;
}
else if(w[j]<=c)
{
printf("+++%4d\n",w[j]);
sum++;
j--;
}
else j--;
}
if(i ==j && w[i] <= c)
{
printf("+++%4d\n",w[i]);
sum++;
}
if(sum ==0 && n>0) printf("人员超重");//每个人都坐不下
else if(sum==0 && n ==0) printf("没有人坐船");
else printf("船数为:%d",sum);
return 0;
}