今天做了一个题,要求的输入是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.youkuaiyun.com/katnissj/article/details/49594023】
【http://www.cnblogs.com/shihaochangeworld/p/5547436.html】
网上还有其他的解法,比如拆分为2和3,或者是模拟查找的过程等等。