问题描述
分析
满足贪心选择性质和最优子结构性质
贪心选择性质
设集合{x1,x2,x3,x4,xn}是箱子重量从小到大的排序,如果集合A是此问题的一个最优解,如果A的第一个箱子k=1,那么A满足贪心选择性质的最优解,如果k!=1,那么存在一个集合B=A-{k}+{1},此时A,B内元素个数一样多,但是B的总重量更小,说明B也是最优解,那么一定存在一个以贪心选择开始的最优解
最优子结构性质
设(x1,x2…xn)是最优装载的满足贪心选择性质的最优解,x1=1,那么(x2,x3…xn)是轮船载重量为c-w1,是装船集装箱为{2,3,…n}时相应的最优装载问题的最优解。得以证明,最优问题具备最优子结构性质
贪心选择策略:重量最轻者先装,可产生最优解
代码实现
#include<stdio.h>
struct box{//保存箱子重量及序号
int no;
int weight;
}z[100];
int main(){
int n,m,i,j,sum=0,cnt=0,load[100];
printf("请输入箱子个数:");
scanf("%d",&n);
printf("请输入集装箱重量限制:");
scanf("%d",&m);
printf("请输入各箱子重量:");
for(i=0;i<n;i++){//创建箱子信息
scanf("%d",&z[i].weight);
z[i].no=i+1;
}
for(i=0;i<n-1;i++){//冒泡排序,将重量轻的放在前面
for(j=0;j<n-i-1;j++){
if(z[j].weight>z[j+1].weight){//交换
int w,a;
w=z[j].weight;
a=z[j].no;
z[j].weight=z[j+1].weight;
z[j].no=z[j+1].no;
z[j+1].weight=w;
z[j+1].no=a;
}
}
}
int k=0;
for(i=0;i<n;i++){
if(sum+z[i].weight<=m){
sum+=z[i].weight;
load[k++]=z[i].no;//记录物品序号
}else break;
}
printf("一共可以装载%d个物体\n",k);
for(i=0;i<k-1;i++){//序号排序
for(j=0;j<k-i-1;j++){
if(load[j]>load[j+1]){
int t=load[j];
load[j]=load[j+1];
load[j+1]=t;
}
}
}
printf("装载的物体序号为:");
for(i=0;i<k;i++) printf("%d ",load[i]);
return 0;
}
截图验证: