乘船问题
发布时间: 2018年4月24日 15:21 时间限制: 1000ms 内存限制: 128M
描述
有n个人,第i个人重量为w[i]。每艘船的最大载重量均为C,且最多只能乘两个人。请问如何用最少的船装载所有人。
输入
输入有多组数据。每组数据第一行输入两个整数n和C,表示有n个人,每艘船最大载重量为C,第二行输入n个整数w[i],表示每个人的重量。所有数据均在[1, 1000]内,对于所有的w[i],都有w[i] <= C。
输出
对应每组数据,输出一个整数,表示装载所有人用的最少船数。
样例输入1 复制
3 100 50 90 40
样例输出1
2
————————————————————————————————————————————————————
乘船问题是标准的动态规划问题,每次讲到DP总逃不过乘船问题,题解在网上有很多很多,其本质就是让最重和最轻的人先上船(在船载重范围中的时候)
下面是AC代码
#include<iostream>
#include<stack>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
int p[1010];
int main()
{
int n,c;
while(cin>>n>>c){
for(int i=1;i<=n;i++)
{
cin>>p[i];
}
sort(p+1,p+n+1);//按体重大小从小到大排序
int i=1;int j=n;int s=0;//i j分别对应体重最轻和最大的两个人
while(i<=j){
if(i==j){
s++;break;
}
if(p[i]+p[j]>c){
s++;
j--;
}//如果装不下,就换次大的
else if(p[i]+p[j]<=c){
s++;
i++;
j--;
}
}
cout<<s<<endl;
}
return 0;
}
由于思路比较简单,在这里就不贴标程了。