UVA 529 Addition Chains(迭代搜索)
Addition Chains |
An addition chain for n is an integer sequence with the following four properties:
- a0 = 1
- am = n
- a0<a1<a2<...<am-1<am
- For each k ( ) there exist two (not neccessarily different) integers i and j ( ) with ak =ai +aj
You are given an integer n. Your job is to construct an addition chain for n with minimal length. If there is more than one such sequence, any one is acceptable.
For example, <1,2,3,5> and <1,2,4,5> are both valid solutions when you are asked for an addition chain for 5.
Input Specification
The input file will contain one or more test cases. Each test case consists of one line containing one integer n ( ). Input is terminated by a value of zero (0) for n .
Output Specification
For each test case, print one line containing the required integer sequence. Separate the numbers by one blank.
Hint: The problem is a little time-critical, so use proper break conditions where necessary to reduce the search space.
Sample Input
5
7
12
15
77
0
Sample Output
1 2 4 5
1 2 4 6 7
1 2 4 8 12
1 2 4 5 10 15
1 2 4 8 9 17 34 68 77
题意:给定一个n,要求求出这样一条最短的满足以下条件的加法链:
1、起点为1,终点为n, 2、递增 3、每个数字可以找到该链中其他两个数字相加组成
思路:本来我的思路是直接暴力的。。果断超时。大一点的数据都跑不出来。。原因是如果直接搜。加法链的个数没有限制,直接要多很多不必要的搜索。
然后在网上看到了一种迭代搜索法。是先确定一个最小的条件。在本题中,仔细观察不难发现,如果每次都是以两倍的趋势上升,那么加法链将会最短。那么由最短的这个条件开始,进行搜索,如果这个条件搜不到,就把条件+1,继续搜索。直到出现一个满足条件的方案结束。。
不过这题要多一个优化。举个例子。比如n为16时。最短条件为5.前3个数字为1 2 3时候,最大将只能为1 2 3 6 12,是到不了16的,因此可以发现。如果一个数字,不断乘2直到到达那个条件。如果小于n,那么这条搜索多余的,直接返回。
#include <stdio.h>
#include <string.h> int n;
int ci;
int judge;
int out[10005];
void dfs(int num)
{
if (judge)
return;
if (num == ci)
{
if (out[num] == n)
{
judge = 1;
}
return;
}
for (int i = num; i >= 0; i --)
{
for (int j = num; j >= i; j --)
{
if (out[i] + out[j] > out[num] && out[i] + out[j] <= n)
{
int sum = out[i] + out[j];
for (int k = num + 1; k <= ci; k ++)
{
sum *= 2;
}
if (sum < n)
continue;
out[num + 1] = out[i] + out[j];
dfs(num + 1);
if (judge)
return;
}
}
}
}
int main()
{
while (scanf("%d", &n) != EOF && n)
{
judge = 0;
ci = 0;
int sb = 1;
while (sb < n)
{
sb *= 2;
ci ++;
}
while (1)
{
memset(out, 0, sizeof(out));
out[0] = 1;
dfs(0);
if (judge)
break;
ci ++;
}
for (int i = 0; i < ci; i ++)
{
printf("%d ", out[i]);
}
printf("%d\n", out[ci]);
}
return 0;
}
但是这个写法还是有一定问题的。。我测试了一些数据。如1111.还是要跑好一会的。。不过没超时。估计是数据的问题。。然后看了别人的代码。写了另一个。这个方法是先确定一个上限。每次找到后,把上限进行缩小。直到找到最小为止。。
#include <stdio.h>
#include <string.h> int n;
int end;
int num[35];
int output[35];
void dfs(int star)
{
if (star < end)
{
for (int i = star - 1; i >= 0; i --)
{
int sum = num[star - 1] + num[i];
if (sum <= n)
{
num[star] = sum;
if (num[star] == n && end > star)
{
for (int j = 0; j <= end; j ++)
{
output[j] = num[j];
}
end = star;
}
int sb = sum;
for (int j = star + 1; j <= end; j ++)
sb *= 2;
if (sb < n)
continue;
dfs(star + 1);
} }
}
}
int main()
{
while (scanf("%d", &n) != EOF && n)
{
memset(num, 0, sizeof(num));
memset(output, 0, sizeof(output));
if (n == 1)
{
end = 0;
output[0] = 1;
}
else
end = 30;
num[0] = 1;
dfs(1);
for (int i = 0; i < end; i ++)
printf("%d ", output[i]);
printf("%d\n", output[end]);
}
return 0;
}
UVA 529 Addition Chains(迭代搜索)的更多相关文章
- UVA 529 - Addition Chains,迭代加深搜索+剪枝
Description An addition chain for n is an integer sequence with the following four properties: a0 = ...
- [POJ2248] Addition Chains 迭代加深搜索
Addition Chains Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5454 Accepted: 2923 ...
- 1443:【例题4】Addition Chains
1443:[例题4]Addition Chains 题解 注释在代码里 注意优化搜索顺序以及最优化剪枝 代码 #include<iostream> #include<cstdio&g ...
- poj 2248 Addition Chains (迭代加深搜索)
[题目描述] An addition chain for n is an integer sequence with the following four properties: a0 = 1 am ...
- 「一本通 1.3 例 4」Addition Chains
Addition Chains 题面 对于一个数列 \(a_1,a_2 \dots a_{m-1},a_m\) 且 \(a_1<a_2 \dots a_{m-1}<a_m\). 数列中的一 ...
- [POJ 2248]Addition Chains
Description An addition chain for n is an integer sequence with the following four properties: a0 = ...
- Addition Chains POJ - 2248 (bfs / dfs / 迭代加深)
An addition chain for n is an integer sequence <a0, a1,a2,...,am=""> with the follow ...
- 【POJ2248、LOJ#10021】 Addition Chains
事先预警:由于我太蒻了,本做法只能在POJ.LOJ等小数据(N<=100)平台上通过,在UVa(洛谷)上大数据并不能通过 戳我获得更好的观看效果 本题不用看,爆搜就是了,但是纯爆搜显然会爆时间, ...
- C++解题报告 : 迭代加深搜索之 ZOJ 1937 Addition Chains
此题不难,主要思路便是IDDFS(迭代加深搜索),关键在于优化. 一个IDDFS的简单介绍,没有了解的同学可以看看: https://www.cnblogs.com/MisakaMKT/article ...
随机推荐
- 转: Firefox 浏览器对 TABLE 中绝对定位元素包含块的判定有错误
标准参考 元素的包含块 W3C CSS2.1 规范中规定,绝对定位元素的包含块(containing block),由离它最近的 position 特性值是 "absolute". ...
- 基于visual Studio2013解决C语言竞赛题之0521圆盘求和
题目
- Shell中的if else语句小演示
安安静静学习小shell,今天看到if else 喽~ 下面这个脚本是判断用户执行脚本的参数,如果是hello的话,就显示how are you 如果什么都没有,就提示输入 如果参数不是hello,就 ...
- C# 课堂总结1-二进制转换
一.目的:便于计算机表示,稳定性好,符合逻辑运算,真为1,假为0. 二.各进制表示方法: 2进制:0,1 8进制:0-7 16进制:0-9,A,B,C,D,E,F 二.转换方法: 1.各进制转换为10 ...
- JSP两个动作(include,forward)
include动作 <div id="container"> <jsp:include page="HelloWorld.jsp" flush ...
- CentOS 漏洞修补
以前没注意 今后得实时更新系统漏洞和补丁了! 1.Bash软件安全漏洞检测及解决方案 http://netsecurity.51cto.com/art/201409/452322.htm
- Android 修改屏幕解锁方式
Android 修改屏幕解锁方式 问题 在手机第一次开机的时候,运行手机激活的APP 在激活APP允许过程中,当用户按电源键的时候,屏幕黑掉,进入锁屏状态 手机默认的锁屏是滑动解锁 用户这个时候再一次 ...
- 【译】在Asp.Net中操作PDF - iTextSharp - 使用字体
原文 [译]在Asp.Net中操作PDF - iTextSharp - 使用字体 紧接着前面我对iTextSharp简介博文,iTextSharp是一个免费的允许Asp.Net对PDF进行操作的第三方 ...
- PE文件简单介绍
PE(Portable Execute)文件是WIN32下可运行文件遵循的数据格式,也是反汇编调试不可缺少的文件,常见的pe文件有.exe和.dll文件.本文主要介绍pe文件的结构和虚拟内存地址转换到 ...
- 黑马day16 jquery&层次选择器
假设想通过DOM元素之间的层次关系来获取特定元素,比如后代元素,子元素,相邻元素,兄弟元素等,则须要使用层次选择器. 1 .ancestor descendant 使用方法: $("form ...