宿題として、Javaで作成する次のプログラムがあります。
本棚には、K 人の作家が手でコピーしなければならない N 本のスタックがあります。各本には、Ai が本である Ui ページがあります。
各作家にスタックから連続した本を提供する必要があり、本のページを分割することはできません。
作家に本を与えるが、作家がコピーするページの最大数を最小限に抑えるプログラムを作成します。
入力として、ユーザーは数値の文字列を指定します。最初の数値は本の数 N、2 番目の数値は作家の数 K、残りの数値は各書籍のページ数です。
出力として、プログラムはライターがコピーする最大ページ数をユーザーに出力します。
例:
入力: 15 6 30 40 10 40 50 20 30 40 10 70 10 50 30 50 10
出力: 90
この例では、最初のライターは book1 = 30 と book2 = 40 を取得できますが、たとえば book1 = 30 と book3 = 10 を取得することはできません。つまり、スタックの一番上からのみ書籍を取り混ぜずに取得します。
これが私の実装です:
import java.util.*;
public class Library {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// to work with 1.6 erase the second "Integer"
//in 1.7 this works properly
List<Integer> booksList = new LinkedList<Integer>();
System.out.printf("Give: ");
String answer = input.nextLine();
String[] arr = answer.split(" ");
for (String num : arr) {
booksList.add(Integer.parseInt(num));
}
int books = booksList.remove(0);
int writers = booksList.remove(0);
while (booksList.size() > writers) {
mergeMinimalPair(booksList);
}
System.out.println(getMax(booksList));
}
public static void mergeMinimalPair(List<Integer> books) {
int index = 0;
int minValue = books.get(0) + books.get(1);
for (int i = 1; i < books.size() - 1; i++) {
if ((books.get(i) + books.get(i + 1)) < minValue) {
index = i;
minValue = books.get(i) + books.get(i + 1);
}
}
combine(books, index, index + 1);
}
public static void combine(List<Integer> books, int indexA, int indexB) {
Integer a = books.get(indexA);
Integer b = books.get(indexB);
books.remove(indexB);
books.add(indexA, a + b);
books.remove(indexB);
}
public static int getMax(List<Integer> books) {
int max = books.get(0);
for (int i = 1; i < books.size(); i++) {
if (books.get(i) > max) {
max = books.get(i);
}
}
return max;
}
}
私がしていることは、リストの長さが作家の数と等しくなるまで、最小限の本のペアをマージするたびにですが、うまくいきません。この例では、90 ではなく 100 を出力します。
ナップザックのような問題に対する動的プログラミングの解決策と残忍な解決策について聞いたことがありますが、私の大学では動的プログラミングについてまだ教えていません。
私の解決策はうまくいくと確信していましたが、何らかの理由でうまくいきませんでした。これまたは私が間違っていた別の解決策のヒントを教えていただければ幸いです。
DP ソリューションまたは残忍なソリューションのいずれかを指摘することができますが、DP ソリューションを指摘する場合は、DP の実装についてほとんど知らないことに注意してください。
EDIT:私はすでにナップザックのような問題のいくつかを見てきましたが、私が理解できたこのバリエーションと非DPソリューションを持つものを見つけることができませんでした