装船问题——贪心算法思想
来源:互联网 发布: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
- 装船问题——贪心算法思想
- 贪心算法之装船问题
- 贪心算法之最优装船问题
- 贪心算法例题:2052装船问题
- 贪心 装船问题
- 装船问题(贪心)
- 贪心之装船问题
- 贪心F 装船问题
- 贪心算法之最优装船
- [SDUT](2052)装船问题 ---贪心
- 五大算法思想—贪心算法
- 装船问题
- 装船问题
- 装船问题
- 装船问题
- 装船问题
- 装船问题
- 装船问题
- 【bzoj1026】[SCOI2009]windy数
- POJ 1013 Counterfeit Dollar
- Android 压力测试 (记录bug)
- C中数组以及数组相关的简单运算
- 【转载】MAC帧在经过路由器时,其源地址和目的地址会发生改变,路由器的目的地址会出现子在MAC帧中”如何理解?
- 装船问题——贪心算法思想
- 数组颠倒
- 用不同的滤波器对不同强度的噪声进行滤波处理
- nyoj 608 畅通工程
- Java日志全解析(下)
- Linux 命令出现>号(大于号)如何退出
- codeforces 788B Weird journey (欧拉路)
- IO流
- JavaScript模式读书笔记(一)