题意 : 有n根木棍(n<=64),它们由一些相同长度的木棍切割而来,给定这n根木棍的长度,求使得原来长度可能的最小值。

分析 : 很经典的深搜题目,我们发现答案只可能是所有木棍长度总和的因数,那么我们只要去枚举因数然后搜索是否可行即可!具体实现看代码可能更容易看懂,这里不赘述。重要的是体会此类深搜的代码构建过程以及剪枝的考虑的巧妙性!

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
 + ;
bool vis[maxn];
int sticks[maxn];
int CurLen;
int n;
int Remain;///每一次都去重置为
bool DFS(int id, int Lack)///传入的参数为上次选择了哪个木棍、当前还缺多少才能组成一个新的目标木棍
{
    ){///已经组成一个新的木棍了,

        Remain -= CurLen;
        ) return true;///如果当前总长为0,说明此方案可行!

        int which;
        ; vis[which]==true; which++);///由于是排好序,我们取第一个没有使用过的木棍开始下一次的搜索

        vis[which] = true;///标记

        if( DFS(which, CurLen-sticks[which]) ) return true;///开始新一轮搜索

        vis[which] = false;///记得标记回来

        Remain += CurLen;///赋值回来!搜索题代码应当注意的地方!

    }else{
        for(int i=id; i<n; i++){
             && (sticks[i]==sticks[i-] && !vis[i-])) continue;///剪枝:排序后,如果有数字不能返回true,说明在此刻选
                                                                      ///择同样的数字也是一样的结果,所以跳过

            if(vis[i] || Lack < sticks[i]) continue;

            Lack -= sticks[i];
            vis[i] = true;

            if( DFS(i, Lack) ) return true;

            Lack += sticks[i];
            vis[i] = false;

            if(sticks[i] == Lack) break;///剪枝:如果当前if成立,说明刚刚的DFS肯定是
                                        ///到达过Lack==0的,既然不返回true,那么说明
                                        ///此方案不行,不必继续往下面搜下去了!
        }
    }
    return false;
}

bool cmp(int fir, int sec){ return fir > sec; }

int main(void)
{
    while(~scanf("%d", &n) && n){
        ;

        ; i<n; i++){
            scanf("%d", &sticks[i]);
            tot += sticks[i];///累计总和
            vis[i] = false;
        }

        sort(sticks, sticks+n, cmp);///排序方便剪枝

        bool ok = false;
        ]; Len<=tot/; Len++){
            ){
                Remain = tot;///将Remain重置,代表当前搜索状态下总长度还剩多少,如果为0说明成功
                CurLen = Len;///全局变量记录当前枚举的是哪个因数,方便深搜操作
                , Len)){
                    printf("%d\n", Len);
                    ok = true;
                    break;
                }
            }
        }

        if(!ok) printf("%d\n", tot);
    }
    ;
}

最新文章

  1. JSON与String 格式的转换
  2. javascript 时间代理
  3. Python time datetime常用时间处理方法
  4. [BTS] Error biztalk arguments null exception string reference not set to an instance of a string. parameter name
  5. android媒体文件扫描
  6. Git Fast-forward提交
  7. repeater做删除前弹窗询问
  8. js避免全局污染
  9. SRM 582 Div II Level Three: ColorTheCells, Brute Force 算法
  10. make deb for debian/ubuntu, package software for debian/ubuntu
  11. sqllite小型数据库的使用
  12. 第一周-JAVA基本概念
  13. Jmeter之正则表达式提取器应用
  14. docker 搭建 hustoj
  15. 设计模式之责任链模式(Chain of Responsibility )
  16. ARM Linux Oops使用小结(转)
  17. Go Example--变量
  18. (A - 整数划分 HYSBZ - 1263)(数组模拟大数乘法)
  19. Centos 的计划任务 crontab
  20. bzoj 2555

热门文章

  1. python string_2 内建函数详解
  2. LeetCode.872-叶子值相等的树(Leaf-Similar Trees)
  3. 【Linux开发】Linux下jpeglib库的安装详解
  4. 第五周课程总结&amp;实验报告(三)
  5. Java数据结构之单向环形链表(解决Josephu约瑟夫环问题)
  6. python 如何解决高并发下的库存问题??
  7. 利用AXI-DMA批量发送数据到DMA
  8. Windows Server 2016 安装.NET Framework 3.5 错误
  9. linux中几个简单的系统命令(还有一些其他杂项命令)
  10. js中的object类型