poj1416
2016-03-07 10:14
246 查看
设计算法:dfs
题目大意:给定一个数a,将a从中间分开拆成几份,使得各部分的和sum最接近给定的目标数target,输出sum和拆分方案。
注意:
1、sum一定不能大于target,若所有方案的sum都大于target,则输出error。
2、对于所求的sum有两种以上的方案可以实现,则输出rejected。
题目分析:
我们可以按照上如所示的方式进行搜索,1253拆分成(125,3),(12,53),(1,253),125拆分成(12,5),(1,25),12拆分成(1,2),只拆分左边的数,当左边的数小于10的时候就停止拆分
代码如下:
题目大意:给定一个数a,将a从中间分开拆成几份,使得各部分的和sum最接近给定的目标数target,输出sum和拆分方案。
注意:
1、sum一定不能大于target,若所有方案的sum都大于target,则输出error。
2、对于所求的sum有两种以上的方案可以实现,则输出rejected。
题目分析:
我们可以按照上如所示的方式进行搜索,1253拆分成(125,3),(12,53),(1,253),125拆分成(12,5),(1,25),12拆分成(1,2),只拆分左边的数,当左边的数小于10的时候就停止拆分
代码如下:
package com.solo.in; import java.util.Scanner; public class Main_1416_1 { static int targ; static int a; static class Node { int x;int y;Node pre; public Node(int x,int y,Node pre) { this.x=x; this.y=y; this.pre=pre; } } public static void main(String[] args) { Scanner in=new Scanner(System.in); targ=in.nextInt(); a=in.nextInt(); while(a!=0 && targ!=0) { count=0; sum=-1; Node begin=new Node(a, -1, null); dfs(a, 0, 0, begin); if(count==0) { System.out.println("error"); }else if (count==1) { System.out.print(sum+" "); print(p); }else { System.out.println("rejected"); } targ=in.nextInt(); a=in.nextInt(); } } static int count=0; static int sum=-1; static Node p; static void dfs(int x,int y,int z,Node node)// { int tmp=x+y+z; if(tmp<=targ && tmp>sum) { sum=tmp; count=1; p=node; }else if(tmp==sum) { count++; } if(x/10==0) return; for(int i=1;i<=5;i++) { int dx=x/(int)Math.pow(10, i); int dy=x%(int)Math.pow(10, i); if(dx==0) break; Node next=new Node(dx, dy, node); dfs(dx, dy, z+y,next);//将x拆成dx和dy,z+y:表示除dx和dy外其余已拆部分的和 } } static void print(Node p) { if(p.y!=-1) { System.out.print(p.x+" "+p.y); }else { System.out.print(p.x); } while(p.pre!=null && p.pre.y!=-1) { p=p.pre; System.out.print(" "+p.y); } System.out.println(); } }
相关文章推荐
- Android最佳性能实践(二)——分析内存的使用情况
- 异步化DAO的设计和实践
- 使用 MyEclipse 10 搭建 SSH2 框架整合开发环境
- 选择手机上软件打开附件
- 数据分析基础学习大纲汇总
- 2016年2月全球搜索引擎份额:Google份额超67%
- dismissViewController 实现多个模态VC跳转到根VC
- ionic路由详解
- Keepalived原理与实战精讲
- deque与vector的主要区别
- 如何正确理解公共Wi-Fi的不安全性?
- 如何计算时间复杂度
- Netty4.0学习笔记系列之四:混合使用coder和handler
- Netty4.0学习笔记系列之五:自定义通讯协议
- iTerm2 快捷键大全
- APPIUM+JAVA实现对安卓APK的自动化测试----第九篇【为什么】
- C#控制定位Word光标移动到任意行或者最后一行,取得光标位置等操作
- 一个Bootstrap风格的分页控件
- git hub 建立公钥
- 第三方网页聊天工具【好工具】