1103. Integer Factorization (30)[递归遍历+剪枝]

2023-12-02 15:58

本文主要是介绍1103. Integer Factorization (30)[递归遍历+剪枝],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 原题: https://www.patest.cn/contests/pat-a-practise/1103

2. 思路:

题意:
判断一个数能否分解成N个因子的p次方的和。
若是,求出最大的N个因子和。
有多个相同最大和,输出较大的那个序列。比如 1) 1, 2, 3, 5
2) 1, 2, 4, 4
则输出第二种。
递归剪枝题。


思路:
题意并不算多难,但是如何转换成合适的算法呢。
首先会想到暴力破解的方式,毕竟x<=400, 那么因子最大是20.
所以不妨从1~20一个个试得了。这样的思路是对的。
我们可以优化。毕竟是N个因子,超出N个的话就不需要继续判断了。
遍历的过程中,我们从最小值1开始测试,同时记录因子和,若遇到更大的或者相等的,都更新。
这样也满足题目中的多个相同和的情况。


思路整理下,就是递归+剪枝优化的算法。
即当前元素值x,把因子i作为它的一个,那么新的x = x - i^p, 把因子i加入容器factor中.
接着对新的x递归遍历,这时的遍历因子从i开始,而不是从1开始了(因为前面的已经递归处理了)。
递归完成后输出结果就好了。
已AC。

3. 源码:

#include<iostream>
#include<vector>
#include<algorithm>//使用sort排序函数,pow指数函数
#include<functional>//使用内置降序比较greater仿函数
using namespace std;int x, N, p;//分别为给定的正数, 因子个数及指数
int maxsum = -1, cur_sum = 0;//分别为因子和的最大值,当前因子和
vector<int> factor, result;//分别为因子和最终所求的因子的数组容器
void dfs(int x, int cnt);//递归遍历
void print();//输出结果int main(void)
{//freopen("in.txt", "r", stdin);cin >> x >> N >> p;factor.resize(N);dfs(x, 0);//递归遍历因子,参数为元素值,因子的下标顺序。N个因子,下标从0~N-1if (maxsum == -1)//说明未找到cout << "Impossible\n";elseprint();return 0;
}void dfs(int x, int cnt)//递归遍历因子,参数为元素值,因子的下标顺序。N个因子,下标从0~N-1
{if (cnt == N && x != 0)//剪枝优化,已经有N个因子,但和不等于给定的值return;if (x < 0)//剪枝优化,超出了给定值。直接返回return;if (x == 0 && cnt == N)//可分解成N个因子,更新{cur_sum = 0;//因子和for (int i = 0; i < N; i++)cur_sum += factor[i];if (cur_sum >= maxsum)//更新最大和,相等也更新,这样才满足最大的因子序列{maxsum = cur_sum;result = factor;//因子赋值给结果容器}return;}int start = cnt > 0 ? factor[cnt - 1] : 1;//因子起点,第一个因子递归时,因子值从1开始。否则是上一个因子值int end = (int)sqrt(double(x));//因子终点for (int fac = start; fac <= end; fac++)//因子值从小到大进行递归遍历{factor[cnt] = fac;//把新的因子压入容器dfs(x - (int)pow(fac, p), cnt + 1);}return;
}void print()//输出
{sort(result.begin(), result.end(), greater<int>());printf("%d = ", x);for (int i = 0; i < result.size(); i++){if (i != 0)printf(" + ");printf("%d^%d", result[i], p);}printf("\n");
}


这篇关于1103. Integer Factorization (30)[递归遍历+剪枝]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/445930

相关文章

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR

Rust中的BoxT之堆上的数据与递归类型详解

《Rust中的BoxT之堆上的数据与递归类型详解》本文介绍了Rust中的BoxT类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用BoxT来实现递归类型和处理大小未知类型,通过BoxT,Rus... 目录1. Box<T> 的基础知识1.1 堆与栈的分工1.2 性能优势2.1 递归类型的问题2.2

shell脚本自动删除30天以前的文件(最新推荐)

《shell脚本自动删除30天以前的文件(最新推荐)》该文章介绍了如何使用Shell脚本自动删除指定目录下30天以前的文件,并通过crontab设置定时任务,此外,还提供了如何使用Shell脚本删除E... 目录shell脚本自动删除30天以前的文件linux按照日期定时删除elasticsearch索引s

TP-Link PDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务

《TP-LinkPDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务》近期,路由器制造巨头普联(TP-Link)在用户群体中引发了一系列重要变动,上个月,公司发出了一则通知,明确要求所... 路由器厂商普联(TP-Link)上个月发布公告要求所有用户必须完成实名认证后才能继续使用普联提供的 D

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

mysql-8.0.30压缩包版安装和配置MySQL环境过程

《mysql-8.0.30压缩包版安装和配置MySQL环境过程》该文章介绍了如何在Windows系统中下载、安装和配置MySQL数据库,包括下载地址、解压文件、创建和配置my.ini文件、设置环境变量... 目录压缩包安装配置下载配置环境变量下载和初始化总结压缩包安装配置下载下载地址:https://d

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还

hdu1010 奇偶剪枝

恰好t时间到达 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.Arrays;import