剪绳子问题

剪绳子问题的代码练习

  • 题目介绍
    • 思路
    • python
    • C++
    • 后话
    • 参考

题目介绍

给你一根长度为n的绳子,请把绳子剪成整数长的m段(m,n都是整数,n>1,m>1并且m≤n),每段绳子的长度记为k[1],…,k[m]。请问k[1]×…×k[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

思路

其实就把切m段之前的所有可能的最大值都算出来,除了切1 2 3 刀需要人工计算,后面就累乘最大值就好。

python

# encoding=utf-8
import numpy as np  #这是在pycharm上引得库,后来发现牛客不让引,注释掉也可

def max_product_cutting(length):
    if length<2:
        return 0
    elif length==2:
        return 1 #长度为2只能切一刀,且必须切
    elif length==3:
        return 2
    else:
        if length>=4:
            index = list(range(0, length+1))
            #index[0] = 0
            #index[1] = 1 # python的这部分直接定义好了
            #index[2] = 2 # 同上 
            #index[3] = 3 # 同上 

            #从这里开始循环哪个权值最大
            for i in range(4, length+1):
                max_result = 0
                for j in range(1, int(i/2)+1):    
                    if max_result < index[j]*index[i-j]:
                        max_result = index[j]*index[i-j]
                        index[i] = max_result

            print(index)

    return index[length]




if __name__ == '__main__':
    print(max_product_cutting(9))  #随便输入个数字验证一下

C++

#include 
using namespace std;

class Solution {
public:
	int max_product_cutting(int target) 
	{
        if(target<2){
            return 0;
        }else if(target==2){
            return 1;
        }else if(target==3){
            return 2;
        }
        int production[target+1];//存储每个长度的绳子分割之后的最大乘积值
        production[0]=0;
        production[1]=1;
        production[2]=2;
        production[3]=3;
        int max=0;//存储最大乘积
        for(int i=4;i<=target;i++){
            max=0;
            for(int j=1;j<=i/2;j++){
                int tmp=production[j] * production[i-j];//计算当前分割策略最大乘积值
                if(max<tmp){
                    max=tmp;//更替最大值 
                }
                production[i]=max;//绳子长度为i的问题最优解更新
            }
        }
        return production[target];//返回输入的绳子长度分割之后的最大乘积
    }
};

int main()
{
	Solution a;
	int target=8;  //这里随心情改吧 
	int max_product_cutting();
	cout << a.max_product_cutting(target) << endl;
	return 0;
 } 

后话

java等我学会再补吧(QAQ)

参考

C++代码参考链接

你可能感兴趣的:(剑指offer_练习)