Poj1416: Shredding Company

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;	
	}
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值