按每种月饼的单价(重量/总价)递增排序,然后依次求在D范围的月饼都卖,最后不足当前月饼总量时按单价*D卖出所有的D即为最大收益!

代码如下

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
struct node
{
    double a,b;
    double c;
}s[10000];
bool cmp(node a,node b)
{
    return a.c>b.c;
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
        scanf("%lf",&s[i].a);
    for(int i=0;i<n;i++)
        scanf("%lf",&s[i].b);
    for(int i=0;i<n;i++)
        s[i].c=(s[i].b*1.00)/s[i].a;
    sort(s,s+n,cmp);
    double sum=0.0;
    for(int i=0;i<n;i++)
    {
       if(m<=0)
        break;
       if(s[i].a<=m)
       {
           sum+=s[i].b;
           m=m-s[i].a;
       }
       else if(m<s[i].a)
       {
           sum+=s[i].c*m;
           m=0;
       }
    }
    printf("%.2lf\n",sum);
}