给出一个整数n,将n分解为至少两个整数之和,使得这些整数的乘积最大化,输出能够获得的最大的乘积。
例如:
2=1+1,输出1;
10=3+3+4,输出36。
很简单:动态规划
//整数成绩最大化
#include<bits/stdc++.h>
using namespace std;
int main(){ int n,aim,j,i; int tem,a,b; int res[10000]={0};//用来存到该位置的最大值 while(scanf("%d",&n)!=EOF){ res[1]=1; if(n==1){ ; }else{ for(aim=2;aim<=n;aim++){//计算到i tem = 1; for(i=1;i<=aim/2;i++){ j = aim-i; a = i; b=j; if(a<res[i]){ a = res[i]; } if(b<res[j]){ b = res[j]; } if(a*b>tem){ tem = a*b; } } res[aim]=tem; } } printf("%d\n",res[n]); } return 0;
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int three = n / 3;
if (((n - three * 3) & 1) == 1) { three--; }
int two = (n - three * 3) / 2;
int result = (int)(Math.pow(3, three) * Math.pow(2, two));
System.out.println(result);
}
}
解释:最大收益是3,余数为1则分给其中一个3,得到4,余数为2则乘上去 所以只需要列举出递推的前三项,第4、5、6项,然后递推a[i]=a[i-3]*3 为什么不是最大收益不是4以上呢?例如5,5可分解为2*3收益能通过继续分解得到增加。 前几个并不能通过递推公式得到,所以列举出来。 1. num = int(input()) 2. resultList = [0,0,1,2,4,6,9] 3. if num<7: 4. print(resultList[num]) 5. else: 6. for i in range(7,num+1): 7. resultList.append(resultList[i-3]*3) 8. print(resultList[num])
import java.util.Scanner;
public class Main {
/*
* 举例计算11,11=5+6,5*6=30,11=3+4+5,3*4*4=48,11=2+3+3+3,2*3*3*3=54,11=1
*/
static int p(int num) {
int maxMul = 1;
//i表示分解为i个数的加法,这些数相差不超过1.在所有的分解法中选择乘积最大的。
for (int i = 2; i < num; i++) {
int rem = num % i;
int quo = num / i;
int mul = 1;
// int j=1;
for (int j = 1; j <= i - rem; j++)
mul *= quo;
for (int j = 1; j <= rem; j++)
mul *= (quo + 1);
if (mul > maxMul)
maxMul = mul;
else
return maxMul;
}
return maxMul;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
// int num=2;
// num=10;
Scanner scanner=new Scanner(System.in);
// 返回:从输入信息扫描的 int
int num=scanner.nextInt();
System.out.println(p( num));
}
} import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int sum = (int)Math.pow(3, (n / 3 - 1));
if(n % 3 == 1)
sum *= 4;
if(n % 3 == 2)
sum *= 3 * 2;
if(n % 3 == 0)
sum *= 3;
System.out.println(sum);
}
}
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int num = in.nextInt();
System.out.println(Doit(num));
}
//最优化问题,尽量都分成3,不足部分就分成2
public static long Doit(int num) {
long result = 1;
while(num>4){
result = result*3;
num=num-3;
}
result = result * num;
return result;
}
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
if(n <= 3){
System.out.println(n - 1);
}else{
int res = 1;
while(n > 4){
res *= 3;
n -= 3;
}
System.out.println(res * n);
}
}
} def solution(n): if n<=3:return n-1 if n==4:return n if n>4: if n % 3 ==2: return 2 * 3**(n//3) elif n %3 ==1: return 4*3**(n//3-1) else: return 3**(n//3) if __name__ =='__main__': n = int(input().strip()) print(solution(n))
#include<bits/stdc++.h>
using namespace std;
int a[6]={0,0,1,2,4,6};
int cal(int x,int y)
{
if(x<6&&y==0)
{
return a[x];
}
else
{
if(x-3==0)
return 3;
if(x-3==1)
return 4;
if(x==5)
return 6;
if(x>5)
return 3*cal(x-3,1);
}
return 0;
}
int main()
{
int n,i;
long long ans;
scanf("%d",&n);
n=abs(n);
ans=cal(n,0);
printf("%lld\n",ans);
}
class MainActivity:
def main(self):
# Read the data
n = int(input())
# Initialization
maxProd = [1]
# Traverse
for num in range(1, n):
realNum = num + 1
tmpResult = float('-inf')
for subtractNum in range(1, realNum):
subtractResult = realNum - subtractNum
subtractResultIdx = subtractResult - 1
tmpResult = max(tmpResult, subtractNum * maxProd[subtractResultIdx], subtractNum * subtractResult)
maxProd.append(tmpResult)
print(maxProd[-1])
if __name__ == '__main__':
M = MainActivity()
M.main() 这个时间复杂度应该在O(n²)的样子,AC运行时间是45ms。
class MainActivity:
def main(self):
# Read the data
n = int(input())
# Initialization
result = float('-inf')
# Traverse
for k in range(1, n + 1):
if n % k:
lowNum = n // k
highNum = lowNum + 1
result = max(result, lowNum ** (k * lowNum + k - n) * highNum ** (n - k * lowNum))
else:
result = max(result, (n // k) ** k)
print(result)
if __name__ == '__main__':
M = MainActivity()
M.main() 遍历的时间复杂度是O(n),但我感觉乘方也挺耗时间的,看乘方做快速幂优化才行吧。 import java.util.*;
public class Main{
public static int[] res;
public static int solu(int n){
if (n <= 1) return 1;
if (res[n] != 0) return res[n];
int maxValue = 0;
for (int i = 1;i<=n;i++){
maxValue = Math.max(maxValue, i * Main.solu(n-i));
}
res[n] = maxValue;
return maxValue;
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
Main.res = new int[n+1];
if (n == 2){System.out.println(1);}
if (n == 3){System.out.println(2);}
else{
System.out.println(Main.solu(n));
}
}
} // 动态规划
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] dp = new int[n+1];
dp[0] = 1;
dp[1] = 1;
for(int i = 2; i <= n; i++){
for(int j = 1; j <= i/2; j++){
dp[i] = Math.max(dp[i], Math.max(j,dp[j])*Math.max((i-j),dp[i-j]));
}
}
System.out.println(dp[n]);
}
} #include<bits/stdc++.h>
using namespace std;
inline int getRes(int x) {
if(x==2) return 1;
if(x==1) return 1;
if(x<0) return 1;
if(x==3) return 3;
int sum = 1;
while(x>4) {
sum = sum*3;
x-=3;
}
return sum *x;
}
int main(void) {
int f;cin>>f;
cout << getRes(f) <<endl;
} #include <stdio.h>
#define MAXN 1010
long long n;
long long ans[MAXN];
long long max(long long a,long long b);
int main()
{
long long i,j;
ans[1] = 1;
ans[2] = 2;
for(i=3;i<MAXN;i++)
for(j=1;j<=(i>>1);j++)
if(max(j,ans[j])*max(i-j,ans[i-j])>ans[i])
ans[i] = max(j,ans[j]) * max(i-j,ans[i-j]);
scanf("%lld",&n);
printf("%lld\n",ans[n]);
return 0;
}
long long max(long long a,long long b)
{
return a>b?a:b;
} import java.util.Scanner;
public clas***ain {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
if (n == 1 || n == 2) {
System.out.println(1);
return;
}
int res = 0;
for (int i = 2; i <= n / 2; i++) {
int a = n / i;
int b = n - a * i;
if (b != 0){
re***ath.max(res, (int)Math.pow(a,i)*b);
} else {
re***ath.max(res, (int)Math.pow(a,i));
}
}
System.out.println(res);
}
}