C - 装船问题

Description

王小二毕业后从事船运规划工作,吉祥号货轮的最大载重量为M吨,有10种货物可以装船。第i种货物有wi吨,总价值是pi。王小二的任务是从10种货物中挑选若干吨上船,在满足货物总重量小于等于M的前提下,运走的货物的价重比最大。

Input

输入数据的第一行有一个正整数M(0 < M < 10000),表示所有货物最大载重量。在接下来的10行中,每行有若干个数(中间用空格分开),第i行表示的是第i种货物的货物的总价值pi ,总重量wi。(pi是wi的整数倍,0 < pi , wi < 1000)

Output

输出一个整数,表示可以得到的最大价值。

Sample

Input

100
10 10
20 10
30 10
40 10
50 10
60 10
70 10
80 10
90 10
100 10

Output

550

题解:

经典贪心问题,货物可以拆,计算货物的价值与重量的比值,选取比值高(价值高)的装船,货物价值与重量是倍数关系,所以用INT即可。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;
/**
*使用结构体来存储货物信息。
*w货物的重量
*p货物的价值
*ave货物的价值与重量之比。
*/
struct goods{
    int w,p,ave;
}good[15],t;

/**
*冒泡排序,按货物的ave进行降序排序。
*/
void f(){
    int i,j;
    for(i=0;i<9;i++)
    {
        for(j=0;j<9-i;j++){
            if(good[j].ave<good[j+1].ave)
            {
                t = good[j];
                good[j] = good[j+1];
                good[j+1] = t;
            }
        }
    }
}

int main()
{
    /**
    *m船可承载的最大重量。
    *sum船最大可以装的货物价值。
    */
    int m;
    int i, sum = 0;
    scanf("%d",&m);
    //一共10件货物,输入货物的重量价值,并且计算ave。
    for(i=0; i<10; i++){
        scanf("%d%d", &good[i].p, &good[i].w);
        good[i].ave = good[i].p / good[i].w;
    }
    f();
    for(i=0; i<10 && m!=0; i++){
        if(m>=good[i].w){
            sum += good[i].p;
            m -= good[i].w;
        }
        else{
            sum += m * good[i].ave;
            m = 0;
        }
    }
    printf("%d\n",sum);
    return 0;
}

posted @ 2020-10-20 18:49  洛沐辰  阅读(413)  评论(0编辑  收藏  举报