Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2016, 21:34   #1
Hyskills
Новичок
Джуниор
 
Регистрация: 14.12.2015
Сообщений: 1
По умолчанию Динамическое программирование

Во время трансляции концерта предприниматель решил сделать бизнес на производстве кассет. Он имеет M кассет с длительностью звучания D каждая и хочет записать на них максимальное число песен. Эти песни (их общее количество N) передаются в порядке 1, 2, …, N и имеют заранее известные ему длительности звучания L1, L2, …, LN. Предприниматель, прослушивая по порядку песни, может выполнять одно из следующих действий:

если песня на текущую кассету помещается, то он может записать ее на кассету или пропустить песню;
если песня на кассету не помещается, то он может пропустить песню или начать ее записывать на новую кассету (при этом старая кассета откладывается и туда уже ничего не может быть записано).
Необходимо определить максимальное количество песен C, которые предприниматель может записать на кассеты.

Входные данные
Входные данные содержатся в файле input.txt.

В первой строке файла находятся числа N, M и D (все числа натуральные 1 ≤ N ≤ 200, 1 ≤ M ≤ 50, 1 ≤ D ≤ 1000).
Во второй строке, находятся натуральные числа L1, L2, …, LN, разделенные пробелом (1 ≤ Li ≤ 1000).
Выходные данные
Выходные данные находятся в файле output.txt, который в первой строке содержит максимальное количество песен C, которые предприниматель может записать на кассеты.

Пример
input.txt
3 2 4
1 4 1
output.txt
2

Вроде написал свое решение, но оно работает некорректно. К примеру на тесте:
8 4 6
4 2 4 2 6 6 4 2 (Выдает ответ 6, что является неверным)
А на примере :
8 4 6
4 2 4 2 5 5 4 2(тут Выдает уже ответ 7, что является верным)
Не могу понять что делаю не так, в случае когда длина песни равна объему кассеты.
Вот мой код:

Код:
public class Solution {
     static BufferedReader in;
     static StringTokenizer st;
 
 
 static String next() throws IOException {
  if (st == null || !st.hasMoreTokens()) 
  {
      String line = in.readLine();
      if (line == null)
          return null;
      st = new StringTokenizer(line);
  }
  return st.nextToken();
}
 
 public static void main(String[] args) {
      try {
          boolean tack = false;
       in = new BufferedReader(new FileReader("input.txt"));
       PrintWriter out = new PrintWriter(new FileWriter("output.txt"));
       int n = Integer.parseInt(next());
       int m = Integer.parseInt(next());
       int d = Integer.parseInt(next());
       int[] l = new int[n];
       for (int i = 0; i < n; i++)
          l[i] = Integer.parseInt(next());
       
       int space = 0,next_i = 0,next_j=0,next_k=0;
       int[][][] mas = new int[n + 1][m + 1][d];
       
       for (int i = 0; i < n; i++) 
       {
          for (int j = 0; j < m; j++) 
          {
              for (int k = 0; k < d; k++) 
              {
                  space = l[i];
                  next_i = i + 1;
                  next_j = j;
                  next_k = k + space;
          
                  if (need_space > d)
                      continue;
          
                  if (next_k > d) 
                  {
                      next_j++;
                      next_k = space;
                  }
          
                  if (next_k == d) 
                  {
                      next_j++;
                      next_k = 0;
                  }
          
                  if (next_i > n || next_j > m || next_k >= d)
                      continue;
          
                  if (mas[next_i][next_j][next_k] < mas[i][j][k] + 1)
                      mas[next_i][next_j][next_k] = mas[i][j][k] + 1;
 
              }
          }
       }
       
       int res = 0;
       for (int i = 0; i < n + 1; i++)
          for (int j = 0; j < m + 1; j++)
              for (int k = 0; k < d; k++)
                  res = Math.max(res, mas[i][j][k]);
 
       out.println(res);
       out.close();
      } catch (IOException e) {
       
      }
    }
 
}
Hyskills вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое программирование Daniiil Visual C++ 6 10.01.2016 12:48
Динамическое программирование DRGNforce Паскаль, Turbo Pascal, PascalABC.NET 4 01.03.2013 15:35
Динамическое программирование!!! Fuckkiller Microsoft Office Excel 13 04.05.2011 19:03
динамическое программирование stefan0202 Паскаль, Turbo Pascal, PascalABC.NET 3 07.02.2011 22:05
Динамическое программирование Daniya.ru Общие вопросы .NET 2 19.12.2010 11:40