Poj1416: Shredding Company

来源:互联网 发布:微信网络出错1001 编辑:程序博客网 时间:2024/04/28 08:08
1.只能说很遗憾,自己也不知道哪里错了。但就是WA。所有测试数据包括别人给的都是对的。包括自己随便写也是。但是就是WA

  2.逻辑很重要。原来自己用的step而不是start和end,就错的离谱。

3. 另外,要单独有个path记录,每次得到最短路径之后都要new一个新的list记下来。因为还有回溯。

4. 还有关于重复最优解就拒绝。有个计数器就可以了。

5. 大体思路其实很简单,就是dfs的模式。首先确定返回的条件。然后按照两入口深搜。而具体入口里面,显示得到下一步的值,包括路径,总数都加上,剪枝,dfs,然后刚刚加上的再减去,表示回溯即可。


下面是代码

import java.util.*;import java.io.*;public class Main {       //表示输入数据的读入变量static int target, input;static String target2, input2;//static int maxLength;         //记录最接近的数         static int closeInt;         static ArrayList<Integer> path ;  //记录路径//衡量最优质出现的次数:static int t;public static void main(String[] args) {// TODO Auto-generated method stub//File file = new File("C://Users/23192/Desktop/shredding.txt");try {//Scanner scan = new Scanner(file);Scanner scan = new Scanner(System.in);while(scan.hasNext()){                                t = 0;//数据初始化和读入path = new ArrayList<Integer>();target = scan.nextInt();input = scan.nextInt();if(target==0&&input==0)return;closeInt = -1;input2 = input+"";target2 = target+"";boolean flag = false;                              for(int i = 0; i < input2.length(); i++)//对特殊情况进行处理{if(target>Integer.parseInt(input2.charAt(i)+"")){flag = true;break;}}if(target==input){System.out.println(input+" "+input);}else if(flag == false){System.out.println("error");}else{ArrayList<Integer> list = new ArrayList<Integer>();dfs(0,1,0,input2, list);if(t>1){System.out.println("rejected");continue;}System.out.print(closeInt);for(int i = 0; i < path.size(); i++)System.out.print(" "+path.get(i));System.out.println();}}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}static void dfs(int start,int end,int sumNow,String s ,ArrayList<Integer> list){if(end>s.length())//这事回溯条件return ;for(int i = 0; i <2; i++)//两入口,0表示剪短,1表示不剪{if(i==0){      //执行相关动作                               String temp = s.substring(start, end);Integer temp2 = Integer.parseInt(temp);list.add(temp2);sumNow+=temp2;if(sumNow>target)//剪枝{sumNow-=temp2;list.remove(temp2);return ;}if(end==s.length())//表示结束{if(sumNow==closeInt){t = t+1;}else if(sumNow>closeInt){t = 1;closeInt = sumNow;path = new ArrayList<Integer>(list);sumNow-=temp2;list.remove(temp2);return ;}}dfs(end,end+1, sumNow, s, list);sumNow-=temp2;list.remove(list.size()-1);}else if(i==1){dfs(start,end+1, sumNow,s,list);}}return;}}


0 0