老鼠偷吃奶酪:n 種奶酪,每種有價值 x 和重量 y。老鼠能負重 m。可取部分奶酪。求最大總價值。多測資,m=n=-1 結束。
按單位價值 rate = x/y 降序排序。依序取整塊,直到剩餘容量不足,取部分(value += remain * rate)。
double 存儲 rate 與答案。return b.rate - a.rate(降序)。%.3lf。while(scanf("%d%d",&m,&n), m!=-1 || n!=-1)。
#include
#include
typedef struct { int x, y; double rate; } Node;
int cmp(const void* a, const void* b) {
Node* p1 = (Node*)a; Node* p2 = (Node*)b;
if (p1->rate < p2->rate) return 1;
if (p1->rate > p2->rate) return -1;
return 0;
}
int main() {
int m, n;
while (scanf("%d%d", &m, &n) == 2) {
if (m == -1 && n == -1) break;
Node* a = (Node*)malloc(n * sizeof(Node));
for (int i=0; i0; ++i) {
if (a[i].y <= m) {
ans += a[i].x;
m -= a[i].y;
} else {
ans += m * a[i].rate;
break;
}
}
printf("%.3lf\n", ans);
free(a);
}
return 0;
}
rate=0:必須轉 double。