题目链接: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

晴天的魔法乐园——自然数分解之最大积(深度优先+剪枝)相关推荐

  1. 自然数分解:任何一个自然数m的立方均可写成m个连续奇数之和。编程实现:输入一自然数 n,求组成 n3的 n个连续奇数。

    标题 自然数分解 类别 流程控制 时间限制 2S 内存限制 1000Kb 问题描述 任何一个自然数m的立方均可写成m个连续奇数之和.例如: 13=1 23=3+5 33=7+9+11 43=13+15 ...

  2. 自然数分解(罗列出一个自然数的加数的所有组合)(回溯)

    自然数拆分问题: 一个整数N(N > 1)可以拆分成若干个大于等于1的自然数之和,请你输出所有不重复的拆分方式. 6 = 3 + 2 和 6 = 2 + 3, 就是重复的拆分方式. 输入: 6 ...

  3. Python实现大自然数分解为最多4个平方数之和(1)

    问题描述:任意大自然数,总是能分解为最多4个平方数的和,所谓平方数是指它是一个自然数的平方.例如:72884 = 4^2 + 138^2 + 232^2,33788 = 1^2 + 3^2 + 17^ ...

  4. 11091 最优自然数分解问题

    问题描述: 设n是一个正整数. (1)现在将n分解为若干个互不相同的自然数之和,且使这些自然数的乘积最大. (2)现在将n分解为若干个自然数之和,且使这些自然数的乘积最大. 编程任务:对于给定的正整数 ...

  5. 自然数分解求最大乘积

    题目: 把正整数n分解成若干个互不相等的自然数的和,且使这些自然数的乘积最大.请你编写一个算法,由键盘输入n,求满足条件的分解方案. 输入: n (3<=n<=1000) 输出:乘积 分析 ...

  6. 老赵的自然数分解——少侠之对象解

    自然数分解算法的起因介绍,老赵 前几天贴了个非递归的 今天继续搞一个使用对象的解 坚持用对象来解决问题的一个原因,是想证明使用面向对象不是造成算法速度慢的根本原因 例如,我这个面向对象的解,其运行速度 ...

  7. 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 ...

  8. 将任意自然数分解为质数的乘积(Java实现)

    方法一:外层while循环 package com.jake.primefactor;import java.util.ArrayList; import java.util.List;public ...

  9. c语言100以内分解质因数,用C语言实现,将100以内的自然数分解质因数

    仅供参考,尽管是C# //****************************************************************************** // Autho ...

最新文章

  1. 1231. The Embarrassed Cryptography
  2. 56.阶乘因式分解(一)
  3. Java二十三设计模式之-----原型模式
  4. java鼠标监听事件_JAVA 鼠标事件监听ACTIONLISTENER
  5. 136. 只出现一次的数字 golang
  6. git指令如何葱master转到dev_看完这篇还不会用Git,那我就哭了
  7. bzoj 4393 Usaco Fruit Feast
  8. 计算机视觉︱图像取证技术
  9. 《重构》笔记---坏代码的味道与处理
  10. matplotlib之等高线图
  11. docker之网络管理
  12. mysql的连接名和用户名_MySQL登陆认证用户名先后顺序
  13. freebsd jail nginx php-fpm mysql weberp安装
  14. 滤波电容为什么要靠近放置,储能电容为什么均匀放置?去耦半径是什么?滤波电容如何打孔?
  15. 调用招商银行接口(手把手教程,附调用接口工具类)
  16. OR Paper Weekly(一) | 用机器学习生成列生成的列,元启发式算法=动物世界?看OR68年发文数据,哪国位居榜首?
  17. CRC32c polynomial
  18. 姚芊羽整容过度脸变残 娱乐圈假面女神大盘点
  19. 解决IDEA里提示Spring Configuration Check “Unmapped Spring configuration files found.的问题
  20. Revit插件“传送功能”功能介绍

热门文章

  1. s2020gc54最美的花
  2. MOVSB、MOVSW
  3. 电子商务商业模式实训及思考 综合文章:电商模式研究
  4. xdma linux 驱动
  5. [NOI2005]瑰丽华尔兹
  6. C++如何输出彩色字体
  7. surface go能运行python吗_Windows S模式下的Surface Go软件体验
  8. 惯性力 、离心力和科里奥利力
  9. 打包pyinstaller生成的python桌面应用为windows安装包的方法教程
  10. 【tarjan强连通分量】洛谷P1726 上白泽慧音