C++ 贪心算法最优装载问题

最优装载:
有一批集装箱要装上一艘载重量为c的轮船,其中集装箱i的重量为wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。
贪心策略:先轻后重

#include <iostream>
#include <algorithm>
using namespace std;
struct load{  //结构体定义集装箱的编号和重量
    int index;
    int w;}box[1001];  //初始化结构体数组
bool cmp(load a,load b){  //自定义sort函数cmp,按照从小到大的顺序排列
    if(a.w<b.w) return true;
    else return false;
    };
int main()
{
    int c,n;  //c为货船的载重,n为集装箱的个数
    int x[1001]; //此数组用来控制已装载的集装箱编号
    while(cin>>c>>n){
        memset(box, 0, sizeof(box)); //每次输入都要将数组box和x清零
        memset(x, 0, sizeof(x));
        for(int i=1;i<=n;i++){
            cin>>box[i].w;  //输入重量、把编号定义为数组下标
            box[i].index=i;}
        stable_sort(box,box+n+1,cmp);  //稳定排序,用sort也可
        if(box[1].w>c) {cout<<"no  answer"; continue;}
        int j;
        for(j=1;j<=n&&box[j].w<=c;j++){
            x[box[j].index]=1;
            c-=box[j].w;}
        cout<<j-1<<endl;
        for(j=1;j<=n;j++){
        if(x[j]) cout<<j<<" ";
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值