最佳运输方案

题目描述

现有N件货物需要运送到目的地,它们的重量和价值分别记为:

重量:W1,W2,...,Wn

价值:V1,V2,...,Vn

已知某辆货车的最大载货量为X,并且当天只能运送一趟货物。这辆货车应该运送哪些货物,才能在不超载的前提下使运送的价值最大?

输入输出格式

输入格式:

第一行为货车的最大载货量x(1<x≤100),第二行为待运送的货物数n(1<n≤20);

后面n行每行两个用空格隔开的实数,分别为第1至第n件货物的重量W和价值V。

输出格式:

第一行为被运送货物的总价值(只输出整数部分);

第二行为按编号大小顺序输出所有被运送货物的编号(当一件都不能运送时,不输出)。

输入输出样例

输入样例:
20
4
3.5 4
4 5
5 6.8
6.9 7
输出样例:
22 
1 2 3 4
(这一题可以利用二进制01枚举的方法来做)
#include<iostream>
using namespace std;
struct mip
{
    float zl,jz;
}h[100000];
float JZ,ZL,x,y;
int u,q;
int b[100000000];
int maxx=-10000000,e[10000000];
int main()
{
    cin>>x>>y;
    for(int i=1;i<=y;i++)
    {
        cin>>h[i].zl>>h[i].jz;
    }
    while(b[0]==0)
    {

        for(int i=y;i>=0;i--)
        {
            if(b[i]==0)
            {
                b[i]=1;
                break;
            }
            else
            {
                b[i]=0;    
            }
        }
        for(int i=y;i>=0;i--)
        {
            if(b[i]==1)
            {
                JZ+=h[i].jz;
                ZL+=h[i].zl;
            }
        }
        if(ZL<=x)
        {
            if(JZ>maxx)
            {
                maxx=JZ;
                for(int i=1;i<=y;i++)
                {
                    if(b[i]==1)
                    {
                        e[++q]=i;
                    }
                    
                }
                u=q;
                q=0;
            }
        }
        ZL=JZ=0;
    }
    cout<<maxx<<endl;
    int f=0;
    for(int i=1;i<=u;i++)
    {
        if(f==0)
        {
            cout<<e[i];
            f++;
        }
        else cout<<" "<<e[i];
    }
    
    
    
    
    return 0;
} 

猜你喜欢

转载自www.cnblogs.com/liaoshuangqi/p/10689096.html