首先我们来看一道题:
某天,海盗劫掠了一艘装有各种各样古董的船,但海盗船最大载重量为C,每件古董的重量为wi,海盗该如何尽可能数量多的把古董装上船?
输入
请输入载重量c以及古董的个数n:
30 8
请输入每个古董的重量,空格分开:
4 10 7 11 3 5 14 2
输出
能装入的古董最大数量为Ans=5
思路:船的容量固定,优先把重量小的物品放进去,在容量固定的情况下。装的物品最多。采用重量最轻者先装的贪心选择策略,从局部最优达到全局最优,从而产生最优装载问题的最优解。 1)当载重量为定值c时,wi越小时,可装载的古董数量n越大。只要依次选择最小重量古董,直到不能再装为止。2)把n个古董的重量从小到大(非递减)排序,然后根据贪心策略尽可能多地选择出前i个古董,直到不能继续装为止,此时达到最优解。
解题步骤:
1)数据结构的定义。根据算法设计描述,我们用一维数组存储古董的重量double w[N];//一维数组存储古董的重量。
2)按重量排序,利用c++中的sort对古董的进行从小到大(非递减)排序。要使用得引用 #include <algorithm>头文件。
sort(w,w+n)
3 ) 按照贪心策略找最优解
首先用变量ans记录以及装载的古董个数,tmp代表装载到船上的古董的重量,按照重量从小到大排序,依次检查每个古董,tmp加上该古董的重量,如果小于等于载重量c,则ans++,否则退出。
#include <iostream>
#include <algorithm>
const int N = 100005;
using namespace std;
double w[N];//古董的重量数组
int main()
{
double c;
int n;
cout<<"请输入载重量c以及古董的个数n: "<<endl;
cin>>c>>n;
cout<<"请输入每个古董的重量,用空格分开:"<<endl;
for(int i = 0;i<n;i++){
cin >> w[i];//输入每个物品的重量
}
sort(w,w+n);//按古董升序排序
double tmp = 0.0;
int ans = 0;//tmp为已装载到船上的古董重量,ans为已装载的古董个数;
for(int i = 0; i<n;i++){
tmp+=w[i];
if(tmp<=c)
ans ++;
else
break;
}
cout<<"能载入的古董最大数量为Ans=";
cout<<ans<<endl;
return 0;
}
输出结果: