有n个集装箱要装上一艘载重量为W的轮船,其中集装箱i(1<=i<=n)的重量为wi。不考虑集装箱的体积限制,现要选出尽可能多的集装箱上轮船,使得它们的重量之和不超过W。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define MAXN 20 //最多集装箱个数
int w[] = {0,5,2,6,4,3}; //各集装箱重量,不用下标为0的元素
int n=5,W=10;
int maxw; //存放最优解的总重量
int x[MAXN]; //存放最优解向量
void solve();
int main()
{
solve();
printf("最优方案\n");
for(int i=1;i<=n;i++)
if(x[i]==1)
printf("选取重量为%d的集装箱\n",w[i]);
printf("总重量=%d\n",maxw);
}
void solve() { //求解最优装载问题
memset(x,0,sizeof(x)); //初始化解向量
sort(w,w+n+1); //递增排序。
int restw=W; //剩余重量
for(int i=1;i<=n&&w[i]<=restw;i++){
x[i]=1; //选择集装箱i
restw-=w[i]; //减少剩余重量
maxw+=w[i]; //累计装载总重量
}
}