晴天的魔法乐园——自然数分解之最大积(深度优先+剪枝)
题目链接:https://judger.net/problem/1062
Problem Description
给定一个正整数N,将它表示成至少两个正整数之和(即N=a1+a2+…+ak, k > 1),求a1 × a2 × … × ak的最大值。
例如对N=4来说,共有下面4种不同的方案:
4=1+1+1+1
4=1+1+2
4=1+3
4=2+2
其中最大的乘积是最后一种,最大乘积是2×2=4。
Input
每个输入文件一组数据。
第一行为一个正整数N(2<=N<=20)。
Output
输出一个正整数,表示a1 × a2 × … × ak的最大值。
Sample Input 1
2
Sample Output 1
1
Sample Input 2
4
Sample Output 2
4
Sample Input 3
6
Sample Output 3
9
1、分析
这道题目和浙大PAT甲级真题有点相似,PAT.A.1103 Integer Factorization (30 分),用同样的方法即可。如果使用枚举法肯定是不现实的,采用深度优先搜索+剪枝是一个比较好的方法。由于每次进行递归的时候都有一个临时乘积变量,因此枚举的范围应该是1~N-1,不能是0~N。
2、代码
①本题代码:
#include<stdio.h>
int maxProduct = 0, N;
//index为当前索引,sum为当前选出的整数和,product为当前积
void DFS(int index, int sum, int product){if(sum == N){ //找出的几个数的和刚好等于N if(product > maxProduct){ //找出最大积 maxProduct = product;}return;}if(sum > N){ //和大于N,直接返回 return;}for(int i = index; i < N; i++){ //从index ~ N-1进行枚举 DFS(i, sum + i, product * i);}
}int main(){scanf("%d", &N);DFS(1, 0, 1); //注意搜索的起点 printf("%d\n", maxProduct);return 0;
}
②如果要保存下来取得最大积时选择的数据可以采用下面的方法,在递归的for循环里面使用vector进行保存,当数据较多时可以在for里面剪枝,如下:
#include<stdio.h>
#include<vector>
using namespace std;
int maxProduct = 0, N;
void DFS(int index, int sum, int product, vector<int> &ans, vector<int> temp){if(sum == N){ if(product > maxProduct){ maxProduct = product;ans = temp;}return;}if(sum > N){ return;}for(int i = index; i < N; i++){ //从index ~ N-1进行枚举 temp.push_back(i); //加入temp中 if(sum + i > N) break; //剪枝 DFS(i, sum + i, product * i, ans, temp);temp.pop_back(); //从temp中除去 }
}int main(){scanf("%d", &N);vector<int> ans, temp; DFS(1, 0, 1, ans, temp); //注意搜索的起点if(ans.size() == 0) printf("0"); //当输入1时特判输出为0 for(int i = 0; i < ans.size(); i++){printf("%d", ans[i]);if(i < ans.size() - 1) printf(" ");} return 0;
}
③如果要求有多少种方案,直接使用一个变量,在每次递归的时候出现和等于N的时候+1即可
#include<stdio.h>
int N;
void DFS(int index, int sum, int &ans){if(sum == N){ans++; //方案数目+1 return;}if(sum > N){ //和大于N,直接返回 return;}for(int i = index; i < N; i++){ //从index ~ N-1进行枚举 DFS(i, sum + i, ans);}
}int main(){scanf("%d", &N); int ans = 0;DFS(1, 0, ans);printf("%d\n", ans);return 0;
}
原文链接:https://www.qsp.net.cn/art/177.html
晴天的魔法乐园——自然数分解之最大积(深度优先+剪枝)相关推荐
- 自然数分解:任何一个自然数m的立方均可写成m个连续奇数之和。编程实现:输入一自然数 n,求组成 n3的 n个连续奇数。
标题 自然数分解 类别 流程控制 时间限制 2S 内存限制 1000Kb 问题描述 任何一个自然数m的立方均可写成m个连续奇数之和.例如: 13=1 23=3+5 33=7+9+11 43=13+15 ...
- 自然数分解(罗列出一个自然数的加数的所有组合)(回溯)
自然数拆分问题: 一个整数N(N > 1)可以拆分成若干个大于等于1的自然数之和,请你输出所有不重复的拆分方式. 6 = 3 + 2 和 6 = 2 + 3, 就是重复的拆分方式. 输入: 6 ...
- Python实现大自然数分解为最多4个平方数之和(1)
问题描述:任意大自然数,总是能分解为最多4个平方数的和,所谓平方数是指它是一个自然数的平方.例如:72884 = 4^2 + 138^2 + 232^2,33788 = 1^2 + 3^2 + 17^ ...
- 11091 最优自然数分解问题
问题描述: 设n是一个正整数. (1)现在将n分解为若干个互不相同的自然数之和,且使这些自然数的乘积最大. (2)现在将n分解为若干个自然数之和,且使这些自然数的乘积最大. 编程任务:对于给定的正整数 ...
- 自然数分解求最大乘积
题目: 把正整数n分解成若干个互不相等的自然数的和,且使这些自然数的乘积最大.请你编写一个算法,由键盘输入n,求满足条件的分解方案. 输入: n (3<=n<=1000) 输出:乘积 分析 ...
- 老赵的自然数分解——少侠之对象解
自然数分解算法的起因介绍,老赵 前几天贴了个非递归的 今天继续搞一个使用对象的解 坚持用对象来解决问题的一个原因,是想证明使用面向对象不是造成算法速度慢的根本原因 例如,我这个面向对象的解,其运行速度 ...
- xdoj_64自然数分解
问题描述 任何一个自然数 m 的立方均可写成 m 个连续奇数之和.例如: 1 3 = 1 1^3=1 13=1 2 3 = 3 + 5 2^3=3+5 23=3+5 3 3 = 7 + 9 + 11 ...
- 将任意自然数分解为质数的乘积(Java实现)
方法一:外层while循环 package com.jake.primefactor;import java.util.ArrayList; import java.util.List;public ...
- c语言100以内分解质因数,用C语言实现,将100以内的自然数分解质因数
仅供参考,尽管是C# //****************************************************************************** // Autho ...
最新文章
- 1231. The Embarrassed Cryptography
- 56.阶乘因式分解(一)
- Java二十三设计模式之-----原型模式
- java鼠标监听事件_JAVA 鼠标事件监听ACTIONLISTENER
- 136. 只出现一次的数字 golang
- git指令如何葱master转到dev_看完这篇还不会用Git,那我就哭了
- bzoj 4393 Usaco Fruit Feast
- 计算机视觉︱图像取证技术
- 《重构》笔记---坏代码的味道与处理
- matplotlib之等高线图
- docker之网络管理
- mysql的连接名和用户名_MySQL登陆认证用户名先后顺序
- freebsd jail nginx php-fpm mysql weberp安装
- 滤波电容为什么要靠近放置,储能电容为什么均匀放置?去耦半径是什么?滤波电容如何打孔?
- 调用招商银行接口(手把手教程,附调用接口工具类)
- OR Paper Weekly(一) | 用机器学习生成列生成的列,元启发式算法=动物世界?看OR68年发文数据,哪国位居榜首?
- CRC32c polynomial
- 姚芊羽整容过度脸变残 娱乐圈假面女神大盘点
- 解决IDEA里提示Spring Configuration Check “Unmapped Spring configuration files found.的问题
- Revit插件“传送功能”功能介绍