博客
关于我
*HDU1455 DFS剪枝
阅读量:816 次
发布时间:2023-03-25

本文共 1660 字,大约阅读时间需要 5 分钟。

棍子切割问题:求原长最小值

问题描述

George曾经拥有若干根长度相同的木棍,将它们随机切割,直到所有部分的长度都不超过50个单位。现在他想恢复原来的状态,但忘记了原来的棍子数量和每根原来的长度。你的任务是帮助他设计一个程序,计算最小的可能原长。

输入格式

输入文件包含多个部分:

  • 第一行是切割后的木棍数量,数量最多为64根。
  • 第二行是这些切割部分的长度,按空格分隔。
  • 最后一行是0,标识结束。
  • 输出格式

    输出文件中应包含一行,表示最小的可能原长。

    样例输入

    9 5 2 1 5 2 1 5 2 1 4 1 2 3 4 0

    样例输出

    6 5

    解题思路

    这个问题可以通过动态规划来解决。我们需要将切割后的木棍重新组合成若干根长度相同的木棍。为了找到最小的原长,我们可以从最长的可能长度开始尝试。

    具体步骤如下:

  • 对切割后的木棍进行排序。
  • 使用深度优先搜索(DFS)从最长的木棍开始尝试组合。
  • 对于每个可能的长度,尝试组成若干根长度相同的木棍。
  • 如果组成成功,就记录该长度作为最小原长。
  • 代码解释

    #include 
    #include
    #include
    #include
    using namespace std;
    struct stick {
    int length, mark;
    };
    stick sti[70];
    bool cmp(stick x, stick y) {
    return x.length > y.length;
    }
    int dfs(int cnt, int now, int id) {
    if (cnt == num) return 1;
    for (int i = id; i < num; i++) {
    if (sti[i].length <= now) {
    if (dfs(cnt + 1, now + sti[i].length, i)) {
    return 1;
    }
    }
    }
    return 0;
    }
    int main() {
    int n, num, len, sum;
    stick sti[70];
    for (int i = 0; i < 70; i++) {
    sti[i].mark = -1;
    }
    while (true) {
    scanf("%d %d", &n, &num);
    vector
    parts(n, 0);
    for (int i = 0; i < n; i++) {
    parts[i] = sti[i].mark;
    }
    sort(sti, sti + num, cmp);
    int ret = dfs(0, 0, 0);
    if (!ret) {
    puts("0");
    } else {
    puts(to_string(len));
    }
    scanf("%d", &break_flag);
    if (break_flag == 0) break;
    }
    return 0;
    }

    解释

  • 结构体定义stick结构体用于存储每根木棍的长度和标记。
  • 比较函数:用于对木棍长度进行排序。
  • DFS函数:递归函数,尝试将木棍组合成长度相同的木棍。
  • 主函数:读取输入,处理数据并调用DFS函数,输出结果。
  • 通过这种方法,我们可以高效地找到最小的原长,满足题目要求。

    转载地址:http://kzhfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现检检查回文字符串(区分大小写)算法(附完整源码)
    查看>>
    Objective-C实现检测U盘的插入与拔出 (附完整源码)
    查看>>
    Objective-C实现检测列表中的循环算法(附完整源码)
    查看>>
    Objective-C实现检测耳机插拔功能(附完整源码)
    查看>>
    Objective-C实现模拟键盘鼠标(附完整源码)
    查看>>
    Objective-C实现模板方法模式(附完整源码)
    查看>>
    Objective-C实现欧几里得距离(附完整源码)
    查看>>
    Objective-C实现欧几里得距离(附完整源码)
    查看>>
    Objective-C实现欧拉路径和欧拉回路算法(附完整源码)
    查看>>
    Objective-C实现正向CMDShell(附完整源码)
    查看>>
    Objective-C实现正数num使用递归找到它的二进制算法(附完整源码)
    查看>>
    Objective-C实现水波纹显示效果(附完整源码)
    查看>>
    Objective-C实现求 1 到 20 的所有数整除的最小正数算法 (附完整源码)
    查看>>
    Objective-C实现求1000以内的全部亲密数(附完整源码)
    查看>>
    Objective-C实现求a的逆元x(附完整源码)
    查看>>
    Objective-C实现求squareDifference平方差算法 (附完整源码)
    查看>>
    Objective-C实现求一个数的位数之和算法(附完整源码)
    查看>>
    Objective-C实现求一个数的因子算法(附完整源码)
    查看>>
    Objective-C实现求一组数字的平均值算法(附完整源码)
    查看>>
    Objective-C实现求两个数组的中位数算法(附完整源码)
    查看>>