POJ1416--DFS入门

题目:

现在你要研发一种新型的碎纸机,待粉碎的纸上面有一串数字,要求把纸粉碎成的几片上的数字的和尽量接近而不能超过给定的数字target number。比如:一片纸上的数字为12346,target number为50,那么就可以把纸粉碎为1、2、34、6,其加和为43,是所有粉碎方法中最接近50而不超过50的最优解。



分析:这种是一个基本的DFS题目,用来入门是相当不错的.

题目换句话来理解就是有一串数字中间用+号来连接,使其结果小于或等于指定值的最优解.

EG:

总量50 对应字串12346

那么可以分为以下几种情况

50 1+2+3+4+6=16

50 12+3+4+6=25

50 123+4+6=133

50 1+23+4+6=34

等等…

那么我们就可以挨个试,也就是暴力搜索的方法,当然也要剪枝来提高效率.先看看基本的递归图

“”表示剩余字串,也就是下一步要递归的字串

跟着图的思路,那么代码就很容易写出来了,这里只写了一个样例程序,具体输入输出格式可以自己改写

public class Main {
    static int sumTotal = 50;//规定最大值
    static String num = "12346";//规定字串
    static int max = 0;//得到最大值结果
    static boolean isCheck = true;//当前最大值结果是否唯一
    static StringBuilder builder = new StringBuilder();//当前最大值结果对应的方式

    public static void main(String[] args) {
        DFS(num, 0);

    }

    private static void DFS(String num,int curSum){
        //递归结束条件
        if (num == null || "".equals(num)) {
            if (curSum == max) {
                isCheck = false;
                System.err.println(builder.toString()+"---max = "+max+"---check:"+isCheck);
                return ;
            }else if (curSum > max) {
                max = curSum;
                isCheck = true;
                //记录结果,打印
                System.err.println(builder.toString()+"---max = "+max+"---check:"+isCheck);
                builder.delete(0, builder.length());
                return ;
            }
        }
        //这里是循环的主体
        for (int i = 0; i < num.length(); i++) {
            int startNum = Integer.parseInt(num.substring(0,i+1));
            //剪枝,当总和大于total就没必要往后递归了
            if ((curSum + startNum)>sumTotal) {
                return;
            }
            //暂存结果,回溯的时候赋值给builder
            StringBuilder temp = new StringBuilder(builder);
            builder.append(startNum).append(" ");
            //下一步递归
            DFS(num.substring(i+1),curSum+startNum);
            builder = temp;
        }

    }
}

结果很容易得出

时间: 2024-10-06 21:26:14

POJ1416--DFS入门的相关文章

Oil Deposits(poj 1526 DFS入门题)

http://poj.org/problem?id=1562 Oil Deposits Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12595   Accepted: 6868 Description The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp wor

[HDU]1016 DFS入门题

题目的意思就是在1到n的所有序列之间,找出所有相邻的数相加是素数的序列.Ps:题目是环,所以头和尾也要算哦~ 典型的dfs,然后剪枝. 这题目有意思的就是用java跑回在tle的边缘,第一次提交就tle了(服务器负载的问题吧),一模一样的第二次提交就ac了,侧面也反应了递归对stack的开销影响效率也是严重的.好了,上代码!! 题目传送门: HDU_1016 import java.util.Scanner; public class Main { public static final int

poj 1154 LETTERS dfs入门题

//poj 1154 //sep9 #include <iostream> using namespace std; const int maxR=32; char a[maxR][maxR]; int r,s; int ans=1; int vis[200]; void dfs(int i,int j,int len) { ans=max(ans,len+1); if(i+1<r&&vis[a[i+1][j]]==0){ vis[a[i+1][j]]=1; dfs(i+

poj1562 DFS入门

K - 搜索 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1562 Description The GeoSurvComp geologic survey company is responsible for detecting underground oi

poj1416——dfs递归枚举+记录路径

POJ 1416  dfs递归枚举+记录路径 Shredding Company Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4456   Accepted: 2555 Description You have just been put in charge of developing a new shredder for the Shredding Company Although a "normal" s

DFS入门之一

深度优先搜索实现较为简单,需要控制两个因素: 1.已经访问过的元素不能再访问,在实际题目中还要加上不能访问的元素(障碍) 2.越界这种情况是不允许的 以杭电的1312 Red and Black 为例, 这是一道典型的DFS题目 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1312 题目大意:'@'代表起始位置, '.' 代表黑点(可以穿越),'#' 代表红点(障碍) 要求统计最多可以覆盖多少个黑点 题目分析:确定起始位置 -> 开始DFS ->

DFS入门之二---DFS求连通块

用DFS求连通块也是比较典型的问题, 求多维数组连通块的过程也称为--“种子填充”. 我们给每次遍历过的连通块加上编号, 这样就可以避免一个格子访问多次.比较典型的问题是”八连块问题“.即任意两格子所在位置相邻(上下左右对角共八个方位),则在一个连通块.典型例题:HDU 1241 Oil Deposits 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1241 题目描述:输入m行n列的字符矩阵, 统计字符“@”组成八连块的个数. 题意分析:读入数据

hdu 1045 Fire Net DFS入门题

Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7012    Accepted Submission(s): 3975 Problem Description Suppose that we have a square city with straight streets. A map of a city is a

dfs入门

问题是 给你a1到an的所有数字,让你找到和为k的情况有没有可能存在. 分析: 每一个数字都有加或者不加的情况,所以用深度搜索把所有情况都遍历一下即可 代码如下: #include<iostream> using namespace std; #define Max_n 100000 int a[Max_n],n,k; bool dfs(int i,int sum) { if(i==n) return sum==k; if(dfs(i+1,sum)) return true; if(dfs(i

POJ 1416 Shredding Company【dfs入门】

题目传送门:http://poj.org/problem?id=1416 Shredding Company Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6860   Accepted: 3710 Description You have just been put in charge of developing a new shredder for the Shredding Company Although a "