编程题
【问题描述】
给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n>1并且m>1)每段绳子的长度记为k[0],k[1],...,k[m].请问k[0]*k[1]*...*k[m]可能的最大乘积是多少?【要求】
【数据输入】绳子长度,一个整型数n(n>1)
【数据输出】把绳子剪成m段后, 可能的最大乘积数,也是一个整型数
【样例输入】
绳子的长度n=9
【样例输出】
我们把它剪成长度分别为3,3,3的三段,此时得到的最大乘积是3*3*3=27
package Wangben;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
int m=n/3;
if( n % 3 ==0){
System.out.println(Math.pow(3, n));
} else if(n % 3 ==1){
System.out.println(Math.pow(3, m-1)*4);
}else {
System.out.println(Math.pow(3, m) * (n % 3));
}
}
}
def cut(num):
nsqrt = int(num // 2) + 1 # 向上取整
mmax = 1 for x in range(2, nsqrt):
y = num - x
if y not in multis.keys():
multis[y] = cut(y)
mx = max(multis[x], x)
my = max(multis[y], y)
temp = mx * my
if temp > mmax:
mmax = temp
return mmax
pass
if __name__ == '__main__':
# N = int(input().strip())
N = 9
if N < 2:
print('N must be not less than 2!')
multis = {2: 1, 3: 2}
mmax = cut(N)
print(mmax)
pass 直接求解法,递归方式:
每一段长度都根据已有的长度进行划分和计算,比如:
绳长为2米时,最大乘积为1,记为multis[2]=1;此时的拆分形式为1+1;
绳长为3米时,最大乘积为2;记为multis[3]=2;此时的拆分形式为1+2;
绳长为4米时,最大乘积为4;
其中4可拆分为1+3,2+2,3+1;
以1+3为例,因为multi[3]multis[3],此时乘积为1x3=3);
按照这种方式,分别计算每种拆分方式下的乘积,直到拆分组合N/2+1与N-(N/2+1);
然后找出其中的最大值,即为当前绳长下的最大乘积。
#include<iostream>
#include<math.h>
using namespace std;
int x(int m)
{
int a=2,k=m;
while( k < pow( m / a , a-1 ) * ( m - m/a * (a-1) ) )
{
k = pow( m / a , a-1 ) * ( m - m/a * (a-1) ) ;
a++;
}
for(int i=1;i<a-1;i++)
printf("%d*",m/(a-1));
printf("%d=", m - m/ (a-1) * (a-2) );
return k;
}
int main()
{
int m;
cin>>m;
cout<<x(m)<<endl;
}
class Solution: def maxProductAfterCutting(self, n): # write code here if n < 2 : return 0 elif n == 2: return 1 # elif n == 3: # return 2 max_list = [0,1,2] for i in range(3,n+1): if i < n : max = i else: max = 0 for j in range(1,i//2+1): tmp = max_list[j]*max_list[i-j] if tmp > max: max = tmp max_list.append(max) return max_list[n]