DFS

DFS+剪枝

George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to the original state, but he forgot how many sticks he had originally and how long they were originally. Please help him and design a program which computes the smallest possible original length of those sticks. All lengths expressed in units are integers greater than zero.
Input
The input contains blocks of 2 lines. The first line contains the number of sticks parts after cutting, there are at most 64 sticks. The second line contains the lengths of those parts separated by the space. The last line of the file contains zero.
Output
The output should contains the smallest possible length of original sticks, one per line.
Sample Input
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
Sample Output
6
5

题意:一组等长的木棒,将它们随机地裁断,使得每一节木棒的长度都不超过50个长度单位。然后把这些木棒恢复到为裁截前的状态,但忘记了木棒的初始长度。设计一个程序,计算木棒的可能最小长度。每一节木棒的长度都用大于零的整数表示。(题意不是太好概括,就直接翻译一下)

一开始不出所料的TLE了,后来才意识到要设计剪枝。

第一次设计剪枝有点懵逼,没有想到其实很显然也是最关键的那步,卡了整整一天,不得已看了看别人的想法。

其实就是排除掉重复的,这样就不会TLE。

#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
#define Maxn 100
using namespace std;
bool ending=false;
int n,sti[Maxn],vis[Maxn]={0},sum,m,len=-1;
bool compare(int a,int b){
    return a>b;
}
void dfs(int prev_n,int pres_l,int idn){
    if(ending==true)   return;
    if(pres_l==len){
        if(prev_n==n)   ending=true;
        else   dfs(prev_n,0,0);
        return;
    }
    if(pres_l==0){
        while(vis[idn]==1) idn++;
        vis[idn]=1;
        dfs(prev_n+1,sti[idn],idn+1);
        vis[idn]=0;
    }
    else{
        for(int i=idn;i<n;i++){
            if(vis[i]==0&&pres_l+sti[i]<=len){
                if(vis[i-1]==0&&sti[i]==sti[i-1])   continue;
                vis[i]=1;
                dfs(prev_n+1,pres_l+sti[i],i+1);
                vis[i]=0;
            }
        }
    }
}
int main()
{
    while(cin>>n&&n){
        sum=m=0;  ending=false;
        for(int i=0;i<n;i++){
            cin>>sti[i];
            sum+=sti[i];  m=max(sti[i],m);
        }
        sort(sti,sti+n,compare);
        for(len=m;len<sum;len++){
            if(sum%len!=0)  continue;
            else{
                memset(vis,0,sizeof(vis));
                dfs(0,0,0);
                if(ending==true) break;
            }
        }
         cout<<len<<endl;
    }
    return 0;
}

感觉自己会因为嫌麻烦,设计剪枝的时候很容易烦躁……得多练练。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
06-01
DFS(Depth First Search,深度优先搜索)是一种搜索算法,用于在树或图等数据结构中遍历所有节点。DFS 从起始节点开始,沿着一条路径一直遍历到底,直到不能再前进为止,然后返回上一个节点,继续遍历其它路径。DFS 可以用递归或栈来实现。 在 DFS 中,我们可以分为两种遍历方式:深度优先遍历(preorder)、后序遍历(postorder)。深度优先遍历从根节点开始,一直遍历到叶子节点,然后返回上一级节点,进行下一轮遍历。后序遍历则是遍历完子节点之后,再遍历父节点。这两种遍历方式都是基于递归实现的。 下面是一个使用递归实现 DFS 的示例代码(以二叉树为例): ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right class Solution: def dfs(self, node: TreeNode): if node is None: return print(node.val) # 先访问根节点 self.dfs(node.left) # 再遍历左子树 self.dfs(node.right) # 最后遍历右子树 def preorderTraversal(self, root: TreeNode) -> List[int]: self.result = [] self.dfs(root) return self.result ``` 在上面的代码中,我们定义了一个 TreeNode 类来表示二叉树中的节点,其中包括节点的值、左子节点和右子节点。我们还定义了一个 Solution 类来实现 DFS 遍历,其中 dfs() 方法用于进行深度优先遍历,preorderTraversal() 方法则是用于求解前序遍历的结果。在 dfs() 方法中,我们先访问根节点,然后再递归遍历左子树和右子树,直到遍历完整棵树。在遍历各个节点的过程中,我们可以将节点的值保存到一个列表中,最后返回即可。 当我们需要使用 DFS 遍历一棵树时,只需要创建一个 Solution 对象,然后调用其对应的方法即可。比如,可以使用如下代码来创建一棵二叉树,然后对其进行 DFS 遍历: ```python root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.left.right = TreeNode(5) solution = Solution() result = solution.preorderTraversal(root) print(result) # 输出: [1, 2, 4, 5, 3] ``` 在上面的代码中,我们首先创建了一棵二叉树,然后创建了一个 Solution 对象,最后调用其 preorderTraversal() 方法来进行遍历。遍历完成后,将遍历结果输出即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值