编程题
【问题描述】
给你一根长度为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]