UVA 529 - Addition Chains 剪枝+迭代深搜

该博客详细介绍了UVA 529问题,要求找出符合特定加法规则的最短序列。博主通过采用最大策略迭代,并结合两种剪枝策略(和不超过当前数或总和超过目标值)来优化搜索过程,以减少计算次数,最终找到符合条件的最短序列。
摘要由CSDN通过智能技术生成

题目大意:给出一个数字n,要求输出符合公式要求的最短的答案(对于第k个数,必需由前k-1个数选择其中两个进行相加得到,这两个数可以是同一个数,第一个数以给,为1)

解题思路:按最大策略求出最短的迭代次数,如果在当前迭代次数下,没有找到答案,就将迭代次数加1,再进行迭代,直到找到答案

剪枝1:如果前面的数的和不大于当前数的和,或者大于n,就没必要进行迭代了,因为存放答案是按升序排列的,如果符合的话,前面就会有记录

剪枝2:符合1的要求了,得到的数如果按最大策略进行迭代,即下一个数是前一个数的两倍,如果按最大策略迭代完了,还是小于n的话,那么该数就不符合,继续寻找下一个数

#include<cstdio>

bool flag;
int ans[100];
int deep,n;
//cur当前迭代的次数,ans中确定的下标的最大值,deep表示要迭代的次数,也表示要确定的下标的最大值
void dfs(int cur, int deep) {

	if(cur == deep) {
		if(ans[cur] == n)	
			flag = true;
		return ;
	}

	for(int i = 0; i <= cur; i++) 
		for(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值