poj 2248--Addition Chains (uva 529--Addition Chains)

点击打开链接

题目意思:   给定一个正数 n ,要求找到一个最短序列满足 一下4个条件

  •        1 a0 = 1
  •          2 am = n
  •          3 a0 < a1 < a2 < ... < am-1 < am 
  •          4 For each k (1<=k<=m) there exist two (not necessarily different) integers i    and j (0<=i, j<=k-1) with ak=ai+aj;

解题思路:   (uva赤裸裸的超时了,其它poj  zju  bnuoj都是几十毫秒过得,先贴上来,可能uva数据n很大然后我的程序就挂了,等我想通了再来更新代码)。

                       这是一道隐式树问题,没有给我们具体的解空间树,我们需要自己想象。我们知道如果我们对每一个状态都取搜索,结果必然超时。

                      那么我们想到剪枝,方法就是在递归的时候加上一些判断的条件,比如我们搜索是对这颗解空间树搜索,那么如果碰到那些没有用的状态我么可以直接舍去,还有对于当前的长度如果大于已有的最小值也可以直接return

 

代码:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cstdio>
#include <stack>
#include <list>
using namespace std;
#define MAXN 10005

int n , Min;
int ans[MAXN] , temp[MAXN];//ans存储最后的结果,temp存储每一个状态

//递归处理
void dfs(int pos) {
    if(pos >= Min)//如果当前的长度大于或等于Min直接return
        return;
    else{
        for (int i = 0; i < pos; i++) {//枚举每一种可能的状态
            int t = temp[i] + temp[pos-1];
            if(t == n){//t = n说明到达末尾
                if(Min > pos){//判断最小值以及更新ans数组
                Min = pos;
                for(int k = 0 ; k < Min ; k++)
                    ans[k] = temp[k];
                }
                return;
            }
            if(t < n){//小于n进行dfs
                temp[pos] = t;//t存入temp[pos]
                dfs(pos+1);
                temp[pos] = 0;//回溯回来的状态恢复
            }
        }
    }
}

//主函数
int main() {
    while (scanf("%d", &n) && n) {
        memset(ans, 0, sizeof (ans));
        memset(temp, 0, sizeof (temp));
        Min = MAXN;
        if (n > 1) {//n大于1才搜索
            temp[0] = 1;
            ans[0] = 1;
            dfs(1);
            printf("1");
            for (int i = 1; i < Min; i++)
                printf(" %d", ans[i]);
            printf(" %d\n", n);
        }
        else//你等于1直接输出
            printf("1\n");
    }
    return 0;
}
时间: 2024-12-31 11:59:43

poj 2248--Addition Chains (uva 529--Addition Chains)的相关文章

算法:POJ 2184 Cow Exhibition (dp 转换01背包)

题目大意: 有N个物品,每个物品有属性Si和Fi,-1000 <= Si, Fi <= 1000, 每种物品最 多只能选一次,问怎样选使得物品的所有Si和Fi属性之和最大,并且要求Si之和与Fi之和都不能下于 0. 思路: 这题想了很久都没思路,于是跟前辈请教了下,恍然大悟.把属性Si当做是物品的 费用,Fi当做是价值,然后做01背包即可. 代码: #include<iostream> #include<queue> #include<stack> #inc

poj 3101Astronomy(圆周追击+分数最小公倍数)

/* 本题属于圆周追击问题: 假设已知两个圆周运动的物体的周期分别是a ,b, 设每隔时间t就会在同一条直线上 在同一条直线上的条件是 角度之差为 PI ! 那么就有方程 (2PI/a - 2PI/b)* t=PI 所以就有 t=ab/(2|a-b|); 如果有多个物体, 就会有多个t值,所以每隔 所有 t值的最小公倍数的时间所有的物体就会在同一直线上! 另外:如果分数的分子分别是 a1, a2, ...., 和 b1, b2, .... 那么所有分数的最小公倍数就是lcm(a1, a2, ..

奕新集团RAC 11g 生产库环境(待完善无图)

                           奕新集团RAC 11g 生产库环境(待完善无图)     1.硬件规划: CPU     8个 内存 8G 网卡 2张 硬盘 1个90G机内盘 8个存储盘         分区:boot 200M                swap 8G  LVM               /  70G  VG /opt 10G  VG   2.数据库规划:   数据库版本 ORACLE 11gR2  11.2.0.3 - 64   3.操作系统规划:

WebKit 中异步加载脚本(Running scripts in WebKit)- 大大提升界面呈现速度

WebKit 中异步加载脚本(Running scripts in WebKit)- 大大提升界面呈现速度 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. Running scripts in

深入理解JavaScript系列(10) JavaScript核心(晋级高手必读篇)_javascript技巧

适合的读者:有经验的开发员,专业前端人员. 原作者: Dmitry A. Soshnikov 发布时间: 2010-09-02 原文:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/ 参考1:http://ued.ctrip.com/blog/?p=2795 参考2:http://www.cnblogs.com/ifishing/archive/2010/12/08/1900594.html 主要是综合了上面2位高手的中文翻译,

重磅清单 | 当前AI领域尚未攻克的29个难题及进展评估(附百篇文献)

引言 本文列出了人工智能中的开放性问题,根据人工智能路线图研究所重点关注的" 开放性研究问题 "主题,简要介绍该领域的最大挑战和现有技术水平.(译者注:人工智能路线图研究所是一个旨在研究和比较由人工智能领域工作者提出的各种人工智能路线图的新机构.) 这些挑战可分为:人工智能完备(AI-complete)问题,封闭域问题,以及常识推理.学习和感觉运动能力的基本问题.(译者注:对于计算机来说最困难的问题,被非正式地称为"人工智能完备"(AI-complete)的,以此说

Linux 静默安装CentOS 6.6系统上安装Oracle 11gR2(11.2.0.4)

本文档是Oracle Database 11.2.0.4 for CentOS 6.6 Server(x86_64平台)的静默安装指南. 所有操作无需使用图形界面. 静默安装能减少安装出错的可能性, 也能大大加快安装速度. # 后跟命令表示以操作系统下root用户操作; $ 后跟命令表示以操作系统下oracle用户操作;  1.0 安装前检查 内存大小要求  Oracle 11.2 建议内存是在2GB或者更多. 运行以下命令: #  grep MemTotal /proc/meminfo Mem

请教各位算法大神,acm一道题:赋权无向图的最小权值遍历用什么算法(存在负权值)?

问题描述 请教各位算法大神,acm一道题:赋权无向图的最小权值遍历用什么算法(存在负权值)? 1C 如题,问题是这样的:有一赋权无向连通图,可以从任意一结点出发,求遍历所有结点的最小权值路线.结束点也是任意的,每个节点也没有访问次数的限制,但必须每个节点都要被访问到.,想问一下用什么算法呢? 解决方案 可以参考djstera算法,求最短路径~借鉴其中的标记功能,只不过结束状态标志是所有节点均已遍历. 解决方案二: 可以参考djstera算法,求最短路径~借鉴其中的标记功能,只不过结束状态标志是所

我的Android进阶之旅------&amp;gt;经典的大牛博客推荐(排名不分先后)!!

今天看到一篇文章,收藏了很多大牛的博客,在这里分享一下 谦虚的天下 柳志超博客 Android中文Wiki AndroidStudio-NDK开发-移动开发团队 谦虚的天下 - 博客园 gundumw100博客 - android进阶分类文章列表 - ITeye技术网站 CSDN博文精选:Android系列开发博客资源汇总 - CSDN.NET - CSDN资讯 Android笔记本--半年来的研究笔记,导航. - 思想实践地 - CSDN博客 [魏祝林]Android中级教程 - Androi