输出正整数分解的所有数的最大乘积

今天做了一个题,要求的输入是0-50的正整数,输出的该数分解的所有数的最大乘积。

 

输入:15

输出:144

 

我的想法:我想把这个正整数N分解成一串数字的相加 15=2+3+4+6

下面是我的代码:


/**
 * @time     下午7:44:59
 * @author   Lilylee
 * @version  1.0
 * @email    lilylee_1213@foxmail.com
 * TODO
 */



import java.util.Scanner;


public class Main {
public static void main(String[] args) {
 Scanner sc = new Scanner(System.in);
     int num = sc.nextInt();   
     sc.close();      
      Main.funn(num);

}

 static void funn(int num){

int result=1;
if(num<1||num>50){
System.out.println("wrong input!"); 
return;
}
if(num==1){

System.out.println(num);
return;
}

boolean flag=true;
int number=num;

for(int j=2;flag;j++){

number-=j;
result*=j;

if(number<=j){
if(number==1){
result=(result/j)*(j+1);
flag=false;}
else if(number==0){
flag=false;
}
else{
result*=number;
flag=false;}
}

}





System.out.println(result);
}

} 


但是通过率只有50%。

看了官方的解释,应该是用了动态规划,代码如下:


#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define maxn 109
using namespace std;
long long dp[maxn][maxn];
int solve(int n){
	long long ans = 0;
	for(int i = 0; i <= n; i++)
		ans = max(ans, dp[n][i]);
	return ans;
}
int main(){
	int n;
	cin >> n;
	for(int i = 0; i <= n; i++)
		dp[0][i] = 1;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= i; j++){
			for(int k = 0 ; k < j; k++)
				dp[i][j] = max(dp[i][j], dp[i - j][k] * j);
		}
	}
	cout << solve(n) << endl;
	return 0;
}


我的问题应该是当number<j的时候,不能直接就乘上去了,应该要继续分解,

网上有思路说,应该是把这个乘积向前分解,让前面的数+1;总之未通过的50%应该是这个原因造成的。

http://blog.csdn.net/katnissj/article/details/49594023】

http://www.cnblogs.com/shihaochangeworld/p/5547436.html】

网上还有其他的解法,比如拆分为2和3,或者是模拟查找的过程等等。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值