对上文中提到的背包问题提供的表1(第一行为背包总重量15,物品数量5;第2-6行,分别为第1-5件物品的重量与价值),W=15,编程计算最终背包所装物品的编号、总重量与总价值。要求能够把构造的二维表格输出到文件KnapsackResult.txt中。
解:
package week7; import java.io.*; public class Backpack { public static void main(String[] args) { // TODO 自动生成的方法存根 File file1 = new File("Knapsack.txt"); File file2 = new File("KnapsackResult.txt"); int k[][] = new int[6][2]; int K[][] = new int[16][6]; String str; int tempchar; try { FileReader in = new FileReader(file1); BufferedReader bufr = new BufferedReader(in); FileWriter fw = new FileWriter(file2); BufferedWriter bufw = new BufferedWriter(fw); str = ""; int a = 0, b = 0, i = 0; while ((tempchar = bufr.read()) != -1) { str = str + (char) tempchar; if ((char) tempchar == ' ') { a = Integer.parseInt(str.trim()); str = ""; } if ((char) tempchar == '\n') { b = Integer.parseInt(str.trim()); k[i][0] = a; k[i][1] = b; str = ""; i++; } } for(int j = 1; j < 6; j++) { for(int w = 1; w < 16; w++) { if(k[j][0] > w) { K[w][j] = K[w][j-1]; } else if(K[w][j-1] > (K[w-k[j][0]][j-1]+k[j][1])) { K[w][j] = K[w][j-1]; } else K[w][j] = K[w-k[j][0]][j-1]+k[j][1]; } } str=""; tempchar = 32; for(int x = 0; x < 16; x++) { for(int y = 0; y < 6; y++) { System.out.print(K[x][y]+" "); str=str+Integer.toString(K[x][y])+(char) tempchar; if(y==5){ bufw.write(str); bufw.newLine(); str=""; } } System.out.println(); } bufr.close(); in.close(); bufw.close(); fw.close(); } catch(Exception e) { e.printStackTrace(); } } }