装船问题
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
Output
550
代码实现及思想大概.(本人学的也不是很好,也处于一边学习的路上,如有不合适或者理解错误的地方,还请斧正)由于时间原因,思想我会在后期更新。
#include<bits/stdc++.h>
using namespace std;
//定义一个结构体,结构体里面有p(价格),w(质量),v(平均)
struct node
{
int p,w,v;
}a[1111],t;
//定义一个结构体数组,和临时变量t(在冒泡排序的时候用到)
/*int cmp(node a,node b)
{
return a.v>b.v;
}*/
//这个地方就是在用sort函数的cmp函数,其中必须得定义在main函数之外,
//结构体的下面应该是,比较结构体里面的那个变量就用a.比较的变量。
//升序的话就用<,反过来如果降序的话就用>;
int main()
{
int m;
int sum=0;
cin>>m;
for (int i=0;i<10;i++)
{
cin>>a[i].p>>a[i].w;
a[i].v=a[i].p/a[i].w;
//求取他们的价重比
}
//下面的这两个循环是用的冒泡排序的方法把他们的价重比降序排列给排出来
//其实这个地方嫌麻烦的话是可以用sort函数进行排序的,结构体sort函数
//sort(a,a+n,cmp)
//a是数组名,n是数组的长度,cmp是为了比较结构体里具体一项写的函数.
//两个方法二选一就可以了,也可以用其他的方法比较,这里就不讲了。
for (int i=0;i<9;i++)
{
for (int j=0;j<9-i;j++)
{
if (a[i].v<a[i+1].v)
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
}
}
for (int i=0;i<10;i++)
{
if (m-a[i].w>=0)
//如果货物的比我的最大承载量小,就将他的价格加起来,然后更新此时船的
//最大承载量,直到不满足条件跳出循环。
{
sum+=a[i].p; //计算价格和。
m-=a[i].w;//更新此时船的承载量
}
else
//如果不满足刚刚的if,也就是船再装就超载了,
//就让我的sum为价重比乘以m就可以了,一次计算出来。
{
sum+=a[i].v*m;
break;
}
}
cout<<sum;
return 0;
}