装船问题
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
价重比:计算其价值与重量之比
Source
#include <bits/stdc++.h>
using namespace std;
int main()
{
int m;
int a[16]; //用来存储价值
int b[16]; //用来存储重量
int c[16]; //用来存储性价比
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
cin>>m;
for(int i = 0; i < 10; i++)
{
cin>>a[i]>>b[i];
c[i] = a[i] / b[i];
}
//进行排序,性价比最高的放在最前面
for(int i = 0; i < 10 - 1; i++)
{
for(int j = 0; j < 10 - i - 1; j++)
{
if(c[j] < c[j+1])
{
int t = a[j];
a[j] = a[j+1];
a[j+1] = t;
t = b[j];
b[j] = b[j+1];
b[j+1] = t;
//注意,C数组也要换位置,不然后面的排序就会出错,我一开始给忘了,以为不关C的事,样例也过了,就是WA,搞了很久才知道C原来忘记换了,A,B的性价比就变了
t = c[j];
c[j] = c[j+1];
c[j+1] = t;
}
}
}
int sum = 0;
for(int i = 0; i < 10; i++)
{
if(m >= b[i])
{
m = m - b[i];
sum += a[i];
}
else
{
sum += (a[i]/b[i]) * m;
break;
}
}
cout<<sum<<endl;
return 0;
}
/*************
第二种方法,用结构体来存储
struct node {
int p;
int w;
int value;
}t[16],temp;
for(int i = 0; i < 10 - 1; i++)
{
for(int j = 0; j < 10 - 1 - i; j++)
{
if(t[j].value < t[j+1].value)
{
temp = t[j];
t[j] = t[j+1];
t[j+1] = temp;
}
}
}
for(int i = 0; i < 10; i++)
{
if(m >= t[i].w)
{
m = m - t[i].w;
sum += t[i].p;
}
else
{
sum += t[i].value * m;
break;
}
}
******************/