HDU 1455(DFS_F题)解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1455

-----------------------------------------------------------------------------------

题意:给出一定数量的小木棒的长度,它是由等长的若干木棒随意砍断所得到的。对于给定的一组小木棒,请求出可能的原始木棒的最小长度。

思路:

1.首先降序排列,因为木棍越长,可能的约束越大。

2.木棍的总长度除以原来的木棍数量,一定整除,剪枝

3.原来木棍的长度,一定大于等于剪短后最长的木棍,剪枝

4.在搜索的时候,如果发现某根木棒不符合要求,那么跳过之后与其等长的木棍,剪枝

5.如果新组合的木棍无法组合成功,那么直接放弃搜索,回退到上一层,剪枝

6.如果已经成功组合了一部分木棍,剩下的无法组合成功,由于是降序排列,直接放弃,返回上一层,剪枝

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int MAXN =60+5;

int a[MAXN];
int used[MAXN];
int n,leng,last;

int dfs(int rei,int ned)
{
    if(rei==0&&ned==0)    return 1;
    if(ned==0) ned=leng;
    int start=0;
    if(ned!=leng) start=last+1;
    for(int i=start;i<n;i++)
    {
        if(!used[i]&&a[i]<=ned){
            if(i>0){
                if(!used[i-1]&&a[i-1]==a[i])   continue;
            }
            used[i]=1;
            last=i;
            if(dfs(rei-1,ned-a[i])) return 1;
            else{
                used[i]=0;
                if(ned==leng||a[i]==ned)
                    return 0;
            }
        }
    }
    return 0;
}

int cmp1(int a,int b){
    return a>b;
}

int main()
{
    int i;
    while(~scanf("%d",&n)&&n!=0)
    {
        int tot=0;
        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            tot+=a[i];
        }
        for(int k=0;k<MAXN;k++)    used[k]=0;
        sort(a,a+n,cmp1);
        for(leng=a[0];leng<=tot/2;leng++)
        {
            if(tot%leng)   continue;
            if(dfs(n,leng)){
                printf("%d\n",leng);
                break;
            }
        }
        if(leng>tot/2)
            printf("%d\n",tot);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/caomingpei/p/8372098.html

时间: 2024-10-11 02:07:31

HDU 1455(DFS_F题)解题报告的相关文章

hdu 4956 Poor Hanamichi 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4956(它放在题库后面的格式有一点点问题啦,所以就把它粘下来,方便读者观看) 题目意思:给出一个范围 [l, r] 你, 问是否能从中找到一个数证明 Hanamichi’s solution 的解法是错的. Hanamichi’s solution 是这样的: 对于某个数 X,从右往左数它的每一位数字(假设第一位是从0开始数).它 偶数位的数字之和 -  奇数位的数字之和  = 3  而且 这个 X

hdu 1514 Free Candies 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1514 题目意思:有4堆糖果,每堆糖果有n个,从上到下排好,取糖果只能从上往下取,取完的糖果放在篮子里,篮子里最多放5个,如果篮子里有两个颜色相同的糖果则可以取走放进口袋里,问最多能取走多少对糖果放进口袋.n<=40, 糖果颜色最多20种. 这题是抄这个人滴:http://fudq.blog.163.com/blog/static/1913502382014239225290/ 有些地方看得不太懂,本

hdu 2544 最短路 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目意思:给出 n 个路口和 m 条路,每一条路需要 c 分钟走过.问从路口 1 到路口 n 需要的最短时间是多少. 这题是最短路的入门题,从理解d-i--j---k(wg自创的,呵呵)到默打到修改,搞左两日终于好了,哈哈哈~~~太感动了. 第一次错是 少了Dijkstra()函数中的 for (j = 1; j <= n; j++) . 第二次错是把vis[k=j]=1 写在了 if (!v

hdu 1711 Number Sequence 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 题目意思:给出一条有n个数的序列a[1],a[2],......,a[n],和一条有m 个数的序列b[1],b[2],......,b[m],求出b[1],b[2],...,b[m]在序列a中完全匹配时,在序列a中的位置,如果找不到输出-1. 这几天一直在学kmp,该题算是kmp的入门题吧.有个地方要稍稍注意,代码中,主串和模式串的比较初始值为-1,-1,否则如果从0开始,会默认第一个字符是相

08年acm区域赛北京赛区 部分题解题报告

08年区域赛北京赛区 http://poj.org/searchproblem?field=source&key=Beijing+2008 POJ 3921 Destroying the bus stations 题目还是比较难的,当时的榜似乎只有4/25的通过/提交,其实题目数据很水.学长转换模型写了网络流求最小割,可以AC,不过自己造了个数据推翻了正确性.我写了个很挫的bfs套bfs,外层是最小的删除点数,内层是求最短路,数据很水可以AC.但比较蛋疼的在于bfs耗内存,而且队列中的点数是阶乘

最小生成树,POJ和HDU几道题目的解题报告(基于自己写的模板)

首先POJ题目: 链接:1251 Jungle Roads 题目大意:纯求最小生成树,结果为最小权值边的和.采用邻接表 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <queue> 5 using namespace std; 6 7 #define maxn 30 //最大顶点个数 8 int n; //顶点数,边数 9 10 struct arcn

hdu acm 2844 Coins 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844 题目意思:有A1,A2,...,An 这 n 种面值的钱,分别对应的数量是C1,C2,...,Cn.问根据这么多数量的钱 能组成多少个 <= m 的钱. 如果用多重背包来做,超时了...如果用记忆化搜索,还是...超时= =..... 这个方法是网上搜的,觉得好神奇,能看懂一些. 它是根据完全背包的思路做的,但是需要限制每种币种的使用数量,于是就多了个used[] 数组来记录了. ! f[j]

hdu acm 1114 Piggy-Bank 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114 题目意思:给出一个空的猪仔钱ang 的重量E,和一个装满钱的猪仔钱ang 的重量F你,实质上能装入得钱的重量就是F - E.接着有n 种币种,每个币种有两个属性刻画:面值 + 重量.问恰好装满(注意关键词: 恰好)后,需要的钱的最少数量所对应的钱是多少(有点拗口= =.)拿第一组数据来说, 10 110 2 1 1 30 50 我们当然是用两张30 来填满这个只能装100重量的罐啦,如果都用面

HDU 4303 Hourai Jeweled 解题报告

HDU 4303 Hourai Jeweled 解题报告 评测地址: http://acm.hdu.edu.cn/showproblem.php?pid=4303 评测地址: https://xoj.red/contests/view/1155/1 题目描述 Kaguya Houraisan was once a princess of the Lunarians, a race of people living on the Moon. She was exiled to Earth over

圆锥曲线:椭圆小题解题报告

圆锥曲线:椭圆小题解题报告 注意事项: 由于本人水平有限,部分题目解题方法可能非最优解,如有更好方法欢迎在评论区指正. 部分题目讲解可能过于口语化,导致并不符合官方(人教版教材)的要求,请各位在考试中不要学习,使用正确的,符合要求的用语. 本文中可能存在错别字,望发现者在评论区指正. 本篇博客是为记录本人在完成学校作业的过程中遇到的问题,同时给部分同学作为解题参考用. 本篇博客中绘制图像的工具是geogebra. 1~10题: 1 题目: 已知F~1~,F~2~是椭圆\(x^2/4+y^2/3=