Входной сигнал - это доступный бюджет, количество партий, стоимость билета каждой стороны и количество удовольствия на вечеринке. Задача состоит в том, чтобы вывести максимально возможную забаву с доступным бюджетом и используемым бюджетом. Если вы можете выбрать одну из двух партий с одинаковой забавой, выберите более дешевый вариант. (Это SPOJ problem.)Расписание партии - классический рюкзак
Я создал два массива:
m[i][j]
является максимальное удовольствие получить от всех сторон до I с бюджета Jp[i][j]
минимальная цена на ру, чтобы получить макс , весело от сторон до I с бюджетом J
Тогда для каждого г до #parties и для каждого J до бюджета я вычислил значение m[i][j]
и p[i][j]
так:
for(T i = 1; i <= parties; i++) {
for(T j = 0; j <= budget; j++) {
//We get more fun by attending party i
if(price[i] <= j && m[i-1][j-price[i]] + fun[i] > m[i-1][j]) {
m[i][j] = m[i-1][j-price[i]] + fun[i];
p[i][j] = p[i-1][j-price[i]] + price[i];
//We get same fun by attending i, but more cheaply
} else if(price[i] <= j && m[i-1][j-price[i]] + fun[i] == m[i-1][j] && p[i-1][j-price[i]] + price[i] < p[i-1][j]) {
m[i][j] = m[i-1][j-price[i]] + fun[i];
p[i][j] = p[i-1][j-price[i]] + price[i];
//We can't visit the party
} else {
m[i][j] = m[i-1][j];
p[i][j] = p[i-1][j];
}
}
}
Для любого тестового примера я нашел (я могу поделиться некоторыми, если это необходимо), этот алгоритм выдает тот же ответ, что и алгоритмы, одобренные онлайн-судьей. Однако это не одобрено.
Что не так с алгоритмом?
Here - полная программа.