装船问题——贪心算法思想

来源:互联网 发布:linux查看进程pid 编辑:程序博客网 时间:2024/04/27 16:19

Think:
1不要与背包问题混淆,题意挑选货物若干吨而不是挑选多少种货物

sdut题目链接

装船问题
Time Limit: 1000MS Memory Limit: 65536KB

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
输出一个整数,表示可以得到的最大价值。

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

Example Output
550

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

Author

以下为Wrong Answer代码——
原因:理解题意时混淆,挑选了多少种货物,而不是题意中的挑选货物若干吨

#include <bits/stdc++.h>using namespace std;struct node{    int p;    int w;    double z;}ans[14];int cmp(const void *a, const void *b){    struct node *c = (struct node *)a;    struct node *d = (struct node *)b;    if(c->z != d->z)        return (d->z > c->z? 1: -1);    else        return (d->p > c->p? 1: -1);}int main(){    int n, sum, i;    while(scanf("%d", &n) != EOF)    {        sum = 0;        for(i = 0; i < 10; i++)        {            scanf("%d %d", &ans[i].p, &ans[i].w);            ans[i].z = (double)ans[i].p/(double)ans[i].w;        }        qsort(&ans[0], 10, sizeof(ans[0]), cmp);        for(i = 0; i < 10; i++)        {            if(ans[i].w <= n)            {                n -= ans[i].w;                sum += ans[i].p;            }        }        printf("%d\n", sum);    }    return 0;}/***************************************************User name: Result: Wrong AnswerTake time: 0msTake Memory: 148KBSubmit time: 2017-04-15 15:22:17****************************************************/

以下为Accepted代码

#include <bits/stdc++.h>using namespace std;struct node{    int num;    int p;    int w;    double pw;}ans[14];int cmp(const void *a, const void *b){    struct node *c = (struct node *)a;    struct node *d = (struct node *)b;    if(c->pw != d->pw)        return (d->pw > c->pw? 1: -1);    else if(c->w != d->w)        return (c->w - d->w);    else        return (c->num - d->num);}int main(){    int n, i;    double sum;    while(scanf("%d", &n) != EOF)    {        sum = 0;        for(i = 0; i < 10; i++)        {            scanf("%d %d", &ans[i].p, &ans[i].w);            ans[i].num = i;            ans[i].pw = (double)ans[i].p/(double)ans[i].w;        }        qsort(&ans[0], 10, sizeof(ans[0]), cmp);        for(i = 0; i < 10; i++)        {            if(n >= ans[i].w)            {                n -= ans[i].w;                sum += ans[i].p;            }            else            {                sum += (double)n*ans[i].pw;                break;            }        }        printf("%.0lf\n", sum);    }    return 0;}/***************************************************User name: Result: AcceptedTake time: 0msTake Memory: 148KBSubmit time: 2017-04-15 15:33:58****************************************************/
0 0