版权声明:本人原创文章若需转载请标明出处和作者!沙 https://blog.csdn.net/weixin_44143702/article/details/87862431
装船问题
Time Limit: 1000 ms Memory Limit: 65536 KiB
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);
}