思路分析
构造一个结构体数组,用于存放月饼的货量、总价、单价(这里便于之后的排序及计算操作)。之后利用排序算法将月饼按单价降序排列,最后计算利润,这里采用了递归。
代码实现
#include <stdio.h>
#define MAX 1000
struct moon{
double height;
double price;
double single;
};
void qsort(struct moon target[], int left, int right);
//按月饼滴单价降序排序
double calculus(struct moon target[], int request, int lim, int i); //计算总销售额
void swap(struct moon target[], int x1, int x2); //交换两个结构体
int main(){
int i, kinds, request;
double benefit;
scanf("%d%d", &kinds, &request);
struct moon store[MAX];
for(i = 0; i < kinds; i++)
scanf("%lf",&store[i].height);
for(i = 0; i < kinds; i++)
scanf("%lf",&store[i].price);
for(i = 0; i < kinds; i++)
store[i].single = store[i].price/store[i].height;
qsort(store, 0, kinds);
benefit = calculus(store, request, kinds, 0);
printf("%.2lf", benefit);
}
/* - - - - - - - -*/
void swap(struct moon target[], int x1, int x2){
struct moon mid;
{ mid.height = target[x1].height;
mid.price = target[x1].price;
mid.single = target[x1].single;
}
{ target[x1].height = target[x2].height;
target[x1].price = target[x2].price;
target[x1].single = target[x2].single;
}
{ target[x2].height = mid.height;
target[x2].price = mid.price;
target[x2].single = mid.single;
}
}
void qsort(struct moon target[], int left, int right){
int last, i;
last = left;
if(left >= right)
return 0;
for(i = left; i < right; i++){
if(target[i].single > target[left].single)
swap(target, ++last, i);
}
swap(target, last, left);
qsort(target, left, last);
qsort(target, last+1, right);
}
double calculus(struct moon target[], int request, int lim, int i){
double benefit = 0;
if(i >= lim)
return 0;
if(target[i].height >= request){
benefit = request*target[i].single;
return benefit;
}
else{
benefit = target[i].price;
return benefit + calculus(target, request - target[i].height, lim, i+1);
}
}
PS:结构体内的变量可以减少至两个,但对应的需要改写swap函数以及calculus函数。