开始以为是DP,后来发现不是,按大神思路做的,二分查找,实现上并不难
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
struct Ingredient
{
int x, y, s1, p1, s2, p2;
};
static int n, m;
static int min_price(int n, int s1, int p1, int s2, int p2)
{
int i, price, result = INT_MAX;
for (i = 0; (i - 1) * s1 < n; i++)
{
int remain = n - i * s1;
if (remain > 0)
{
if (remain % s2 == 0)
price = i * p1 + (remain / s2) * p2;
else
price = i * p1 + (remain / s2 + 1) * p2;
}
else
price = i * p1;
if (price < result)
result = price;
}
return result;
}
static int can_buy(int man, struct Ingredient *array)
{
int i, sum = 0;
for (i = 0; i < n; i++)
{
sum += min_price(man * array[i].x - array[i].y, array[i].s1,
array[i].p1, array[i].s2, array[i].p2);
if (sum > m)
return 0;
}
return 1;
}
int main()
{
struct Ingredient *array = malloc(100 * sizeof(struct Ingredient));
while (scanf("%d %d", &n, &m), n || m)
{
int i;
for (i = 0; i < n; i++)
scanf("%d%d%d%d%d%d", &(array[i].x), &(array[i].y), &(array[i].s1),
&(array[i].p1), &(array[i].s2), &(array[i].p2));
int low = 0, high = 100000, center;
while (high - low > 1)
{
center = (low + high) / 2;
if (can_buy(center, array))
low = center;
else
high = center;
}
printf("%d\n", low);
}
free(array);
return 0;
}