剪繩子問題 C python3

2021-10-03 03:39:16 字數 1994 閱讀 4564

給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段(m、n都是整數,n>1並且m>1),每段繩子的長度記為 k[0],k[1]...k[m] 。請問 k[0]*k[1]*...*k[m] 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得到的最大乘積是18。

這裡主要是按貪心法的思想去求解。

貪心選擇是採用從頂向下、以迭代的方法做出相繼選擇,每做一次貪心選擇就將所求問題簡化為乙個規模更小的子問題。問題的乙個整體最優解,是從貪心選擇開始的,而且作了貪心選擇後,原問題簡化為乙個規模更小的類似子問題。然後,用數學歸納法證明,通過每一步貪心選擇,最終可得到問題的乙個整體最優解。

數學歸納:

2=1+1,1*1<1+1,可以看出我們在選擇相乘盡可能大時,2是比1更優的選擇

3=1+2,1*2<1+2,可以看出3是比1更優的選擇

4=2+2,2*2=2+2,4和2相同,4可以用2表示

5=2+3,1+2+2,...,2*3是最優的選擇

再往後的數都可以用1,2,3去表示,而3是裡面最優的選擇,並且切分段數越多,乘積一般是越大的

所以我們演算法設計為:

長度為n,n/3,先盡可能的對切分多段長度為3的,

長度不足3的,若為2,因為2比1更優先選擇,所以不拆為1,1,若為1,因為1+3=4,對於4我們是拆分成2+2時,乘積最大。

c++的解決**:

class solution 

if(n%3==0)else if(n%3==1)else

}};

python3的解決**:

class solution:

def cuttingrope(self, n: int) -> int:

if n<=3:

return n-1

a=n//3

b=n%3

if b==0:

return pow(3,a)

if b==1:

return pow(3,a-1)*4

return pow(3,a)*2

給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段(m、n都是整數,n>1並且m>1),每段繩子的長度記為 k[0],k[1]...k[m] 。請問 k[0]*k[1]*...*k[m] 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得到的最大乘積是18。

答案需要取模 1e9+7(1000000007),如計算初始結果為:1000000008,請返回 1。

如果用c++來寫,注意c++的大數溢位問題,是不能直接用乘方去直接取餘的,還要注意pow函式的返回是double型別的,與int型進行計算時是需要強制轉換成int。

在這裡我們是不直接使用pow函式,自定義乙個與pow函式功能相近的newpow函式,在這裡面就完成n個3的相乘,並在每一步都取餘,避免大數的溢位。(newpow函式要定義為long long),newpow可以寫入private,也可以直接寫在public。

c++的解決**:

class solution {

public:

long long newpow(int m){

long long result=1;

for(int i=0;i因為python沒有c++的大數溢位等問題,是可以直接對結果進行直接取餘的,寫起來較簡單。

python3的解決**:

class solution:

def cuttingrope(self, n: int) -> int:

c=1000000007

if n<=3:

return (n-1)%c

a=n//3

b=n%3

if b==0:

return pow(3,a)%c

if b==1:

return pow(3,a-1)*4%c

return pow(3,a)*2%c

劍指offer 剪繩子(C Python)

給你一根長度為n的繩子,請把繩子剪成整數長的m段 m n都是整數,n 1並且m 1 每段繩子的長度記為k 0 k 1 k m 請問k 0 xk 1 x xk m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18。思路 動態規劃 定義函式...

leetcode兩數之和 C Python3

給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。方法1 雙迴圈 2 字典 class solution def twosum self,nums lis...

剪繩子問題

給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段 m n都是整數,n 1並且m 1 每段繩子的長度記為 k 0 k 1 k m 請問 k 0 k 1 k m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18。首先是貪婪演算法 ...