最优装箱问题
给n个物体,第i个物体重量为wi,选择尽量多的物体,使得总量不超过C。
贪心策略:先装最轻的。(不一定得到全局最优解)
题目
有n个物体,第i个物体的重量为wi(wi为正整数)。选择尽量多的物体,使得总重量不超过C。
分析
由于只关心选择的物品的最大数量(而不是最大重量,最大重量需要考虑DP),所以装重的物体没有装轻的物体划算。这里只需对n个物体按重量递增排序,依次选择每个物体直到装不下为止。
这是一种典型的贪心算法,它只顾眼前,却能得到最优解。
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1005;
int n,C; //n个物体 最大载重量C
int w[maxn]; //第i种物品的重量
int main()
{
int i;
int ans=0,sum=0;//ans-选择的物品数 sum-当前物品总装量
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&w[i]);
scanf("%d",&C); //按物品重量递增排序
sort(w,w+n);
for(i=0;i<n;i++)
{ //如果能装载第i件物品,装载之
if(sum+w[i]<C)
{
sum+=w[i];
ans++;
}
}
printf("%d\n",ans);
return 0;
}