装船问题(贪心) SDUT

版权声明:本人原创文章若需转载请标明出处和作者!沙 https://blog.csdn.net/weixin_44143702/article/details/87862431

装船问题

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem 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

Sample Output

550 

Hint

价重比:计算其价值与重量之比

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define pw_ratio ratio///此处为抽象数据结构,便于更改程序
struct node
{
    int p, w, pw_ratio;
} a[15];
void quick_sort(struct node *, int, int);
int main()
{
    int m, i, p;
    scanf("%d", &m);
    memset(a, 0, sizeof(a));
    for(i = 1; i <= 10; i++)
    {
        scanf("%d %d", &a[i].p, &a[i].w);
        a[i].pw_ratio = a[i].p / a[i].w;
    }
    quick_sort(a, 1, 10);
    p = 0;
    for(i = 1; i <= 10; i++)
    {
        if(m >= a[i].w)///注意此处不要写错了,w 写成 p 了找了很久才找到
        {
            p += a[i].p;
            m -= a[i].w;
        }///每装一种货物,m 减少相应值
        else
        {
            p += m * a[i].pw_ratio;
            m = 0;
            break;
        }
    }
    printf("%d\n", p);
    return 0;
}
void quick_sort(struct node *a, int l, int r)
{///根据价重比由大到小排序
    int i, j;
    struct node key;
    i = l;
    j = r;
    if(i >= j)  return;
    key = a[i];
    while(i < j)
    {
        while(i < j && a[j].ratio <= key.ratio)
            j--;
        a[i] = a[j];
        while(i < j && a[i].ratio >= key.ratio)
            i++;
        a[j] = a[i];
    }
    a[i] = key;
    quick_sort(a, l, i - 1);
    quick_sort(a, i + 1, r);
}

 

 

猜你喜欢

转载自blog.csdn.net/weixin_44143702/article/details/87862431