首页 > 其他分享 >170 加成序列 dfs 剪枝

170 加成序列 dfs 剪枝

时间:2024-07-18 15:30:43浏览次数:11  
标签:剪枝 arr int dfs 加成 ans 序列 170

// 170 加成序列.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
https://www.acwing.com/problem/content/172/
满足如下条件的序列 X(序列中元素被标号为 1、2、3…m)被称为“加成序列”:

X[1]=1
X[m]=n
X[1]<X[2]<…<X[m−1]<X[m]
对于每个 k(2≤k≤m)都存在两个整数 i 和 j (1≤i,j≤k−1,i 和 j 可相等),使得 X[k]=X[i]+X[j]。
你的任务是:给定一个整数 n,找出符合上述条件的长度 m 最小的“加成序列”。

如果有多个满足要求的答案,只需要找出任意一个可行解。

输入格式
输入包含多组测试用例。

每组测试用例占据一行,包含一个整数 n。

当输入为单行的 0 时,表示输入结束。

输出格式
对于每个测试用例,输出一个满足需求的整数序列,数字之间用空格隔开。

每个输出占一行。

数据范围
1≤n≤100
输入样例:
5
7
12
15
77
0
输出样例:
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
*/


#include <iostream>
#include <cstring>


using namespace std;

const int N = 150;
int arr[N];
int idx;
int n;
int ans;
int ansArr[N];
int hah[N];

void dfs(int x) {
	if (arr[x] == n) {
		if (ans > (x + 1)) {
			ans = x + 1;
			memcpy(ansArr, arr, sizeof ansArr);
		}
		return;
	}
	if (arr[x] > n) return;
	if (x >= ans) return;


	//查找比arr[x] 大的后继
	int v = arr[x]; int flag = 0;
	int back[N];
	memcpy(back, hah, sizeof hah);

	for (int i = x; i >= 0; i--) {
		if (flag == 1) break;
		for (int j = i; j >= 0; j--) {
			if (arr[i] + arr[j] <= v){flag = 1; break;}
			if (hah[arr[i] + arr[j]] != 0) continue;
			arr[x + 1] = arr[i] + arr[j];
			hah[arr[i] + arr[j]] += 1;
			dfs(x + 1);
		}
	}

	memcpy(hah, back, sizeof hah);
	return ;
}



void solve() {
	dfs(0);

	for (int i = 0; i < ans ;i++) {
		cout << ansArr[i] << " ";
	}
	cout << endl;
}


int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	while (cin >> n) {
		if (n == 0) break;
		idx = 0; ans = 9999999;
		arr[idx++] = 1;
		if (n == 1) { cout << 1 << endl; continue; }
		memset(hah, 0, sizeof hah);
		solve();
	}
	
	return 0;
}

标签:剪枝,arr,int,dfs,加成,ans,序列,170
From: https://www.cnblogs.com/itdef/p/18309630

相关文章

  • 【LeetCode 0051】【剪枝】N皇后
    N-QueensThen-queenspuzzleistheproblemofplacingnqueensonannxnchessboardsuchthatnotwoqueensattackeachother.Givenanintegern,returnalldistinctsolutionstothen-queenspuzzle.Youmayreturntheanswerinanyorder.Eachsolu......
  • 数据结构与算法 —— DFS的实现方法(递归与迭代)
    在讨论文件系统(FileSystem,简称FS)的实现方法时,特别是关注于递归与迭代这两种编程范式,我们实际上是在探讨如何在编程层面上对文件系统进行操作,如遍历目录、创建多级目录等。虽然文件系统的底层实现(如FAT32、NTFS、ext4等)复杂且通常不由应用开发者直接操作,但我们可以从应用层......
  • asyncio/trio fastdfs python client
    Codets.py#!/usr/bin/envpython"""FastDFS并发测试脚本Usage::$python<me>.py200--show"""importfunctoolsimportitertoolsimportjsonimportosimportpickleimportsysimporttimefrompathlibimportPathfr......
  • 0170-Multiboot2 启动头
    环境Time2022-11-11WSL-Ubuntu22.04QEMU6.2.0NASM2.15.05前言说明参考:https://os.phil-opp.com/multiboot-kernel/目标编写一个符合multiboot2规范的启动文件。multiboot2规范https://www.gnu.org/software/grub/manual/multiboot2/multiboot.html#Header-tag......
  • SeaweedFS + TiKV 部署保姆级教程
    在使用JuiceFS时,我们选择了SeaweedFS作为对象存储,以及TiKV作为元数据存储,目前在SeaweedFS上已经存储了近1.5PB的数据。关于SeaweedFS和TiKV配置的参考资料不多,本文将为社区各位用户提供我们的部署实践,并提供详细的命令示例,希望能给社区各位用户一些参考。此外,在文章......
  • 1004 Counting Leaves(dfs):邻接表版:写的太多了
    Afamilyhierarchyisusuallypresentedbyapedigreetree.Yourjobistocountthosefamilymemberswhohavenochild.InputSpecification:Eachinputfilecontainsonetestcase.Eachcasestartswithalinecontaining0<N<100,thenumberofnode......
  • 一文了解HDFS
    1.简介1.1.概述HDFS是基于流数据访问模式的分布式文件系统,其设计建立在“一次写入、多次读取”的基础上,提供高吞吐量、高容错性的数据访问,能很好地解决海量数据的存储问题。流数据:是指数千个数据源持续生成的数据,可以理解为随时间延续而无限增长的动态数据集合......
  • 基于剪枝技术和鲁棒蒸馏融合的轻量对抗攻击防御方法
    对抗训练是一类常用的对抗攻击防御方法,其通过将对抗样本纳入训练过程,从而有效抵御对抗攻击。然而,对抗训练模型的鲁棒性通常依赖于网络容量的提升,即对抗训练所获得的网络为防御对抗攻击而大幅提升网络的模型容量,对其可用性造成较大约束。为解决以上问题,提出一种基于剪枝技术......
  • spark程序在hdfs集群执行,提示: “main“ org.apache.spark.SparkException: Failed to
    1.执行代码spark在hadoop上以集群模式执行代码bin/spark-submit\--masteryarn\--deploy-modecluster\--executor-memory1G\--total-executor-cores2\/root/word_count_cluster.py2.错误截图错误原因:找不到spark目录3.解决办法在/etc/profile文件中配置spa......
  • 深度学习 - 模型剪枝技术详解
    模型剪枝简介模型剪枝(ModelPruning)是一种通过减少模型参数来降低模型复杂性的方法,从而加快推理速度并减少内存消耗,同时尽量不显著降低模型性能。这种技术特别适用于资源受限的设备,如移动设备和嵌入式系统。模型剪枝通常应用于深度神经网络,尤其是卷积神经网络(CNNs)。模型剪......