题目描述
临近开学了,小C才想起来数学老师布置了暑假作业。暑假作业是很多张试卷,每张试卷所需的时间和获取的价值已知,请你帮他安排一下,用他仅剩的一点时间来做最有价值的作业。
接口说明
原型:
int GetMaxValue(int nPapers, int nRemain, int paper[][2], double* pMaxValue)
输入参数:
int nPapers:试卷的数目(1≤Papers≤20)
int nRemain:表示剩余的时间(1≤nRemain≤10000)
int paper[][2]:nPapers*2的数组,每一行的两个元素依次为做完这一份试卷所需的时间、做完这份试卷获取的价值。如果剩余时间不够做完一份卷子,可根据剩余时间获得卷子的部分价值。
输出参数:
double * pMaxValue:获得的最大价值
返回值:
0:异常,1:成功
代码:
#include "OJ.h"
/*
输入: nPapers表示试卷的数目(1≤Papers≤20),nRemain表示剩余的时间(1≤nRemain≤10000),paper[][2]是一个Papers*2的数组,
每一行的两个元素依次为做完这一份试卷所需的时间、做完这份试卷的价值
输出: *pMaxValue为获得的最大价值
返回:
0:异常
1:计算成功返回
*/
//贪心算法,每次取性价比(价值/时间)最高的即可
int GetMaxValue(int nPapers, int nRemain, int paper[][2], double* pMaxValue)
{
if (nPapers<0 || nPapers>200 || nRemain<0 || nRemain>10000)
{
return 0;
}
*pMaxValue=0;
int i,index,timesum=0,timesumMax=0;
double temp[20]={0}; //记录性价比
for (i=0;i<nPapers;i++)
{
temp[i]=(double)paper[i][1]/(double)paper[i][0];
}
int count = 0; //统计已做卷子数
do
{
double curMax = 0;
//找出当前性价比最高的
for (i=0;i<nPapers;i++)
{
if (curMax<temp[i])
{
curMax=temp[i];
index=i;
}
}
temp[index]=0; //找到当前最高性价比后,置为0
timesum+=paper[index][0];
count++;
if (timesum < nRemain) //如果时间没有超过给定时间就加上当前价值
{
*pMaxValue += paper[index][1];
}
else
{
double t=(double)paper[index][1]*(nRemain-timesum+paper[index][0])/(double)paper[index][0];
*pMaxValue += t;
break;
}
}
while (timesum < nRemain && count < nPapers);
return 1;
}