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 block
e.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;
}
}