W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
Question
給定一個(gè)正整數(shù)
圖 15-13 最大切分乘積的問(wèn)題定義
假設(shè)我們將
本題目標(biāo)是求得所有整數(shù)因子的最大乘積,即
我們需要思考的是:切分?jǐn)?shù)量
根據(jù)經(jīng)驗(yàn),兩個(gè)整數(shù)的乘積往往比它們的加和更大。假設(shè)從
如圖 15-14 所示,當(dāng)
貪心策略一:如果切分方案中包含
圖 15-14 切分導(dǎo)致乘積變大
接下來(lái)思考哪個(gè)因子是最優(yōu)的。在
如圖 15-15 所示,當(dāng)
貪心策略二:在切分方案中,最多只應(yīng)存在兩個(gè)
圖 15-15 最優(yōu)切分因子
總結(jié)以上,可推出以下貪心策略。
如圖 15-16 所示,我們無(wú)須通過(guò)循環(huán)來(lái)切分整數(shù),而可以利用向下整除運(yùn)算得到
請(qǐng)注意,對(duì)于
max_product_cutting.cpp
/* 最大切分乘積:貪心 */
int maxProductCutting(int n) {
// 當(dāng) n <= 3 時(shí),必須切分出一個(gè) 1
if (n <= 3) {
return 1 * (n - 1);
}
// 貪心地切分出 3 ,a 為 3 的個(gè)數(shù),b 為余數(shù)
int a = n / 3;
int b = n % 3;
if (b == 1) {
// 當(dāng)余數(shù)為 1 時(shí),將一對(duì) 1 * 3 轉(zhuǎn)化為 2 * 2
return (int)pow(3, a - 1) * 2 * 2;
}
if (b == 2) {
// 當(dāng)余數(shù)為 2 時(shí),不做處理
return (int)pow(3, a) * 2;
}
// 當(dāng)余數(shù)為 0 時(shí),不做處理
return (int)pow(3, a);
}
圖 15-16 最大切分乘積的計(jì)算方法
時(shí)間復(fù)雜度取決于編程語(yǔ)言的冪運(yùn)算的實(shí)現(xiàn)方法。以 Python 為例,常用的冪計(jì)算函數(shù)有三種。
**
和函數(shù) pow()
的時(shí)間復(fù)雜度均為 math.pow()
內(nèi)部調(diào)用 C 語(yǔ)言庫(kù)的 pow()
函數(shù),其執(zhí)行浮點(diǎn)取冪,時(shí)間復(fù)雜度為 變量
使用反證法,只分析
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: