poj 1032 拆分數字使乘積最大

2021-07-04 15:32:55 字數 943 閱讀 7917

參考:

題意:給出乙個數n,將其拆分為若干個互不相等的數字的和,要求這些數字的乘積最大。

分析:我們可以發現任何乙個數字,只要能拆分成兩個大於1的數字之和,那麼這兩個數字的乘積一定大於等於原數。也就是說,對於連乘式中,如果將乙個乘數a更換為兩個數字b×c(a=b+c且b>1,c>1),那麼乘積只可能增大或不變,不會減小。

所以我們拆分的原則就是將這些數字拆得盡量小,拆成許多2的乘積是最好的。

又因為題目約束各個數字不能相同,則我們拆分的結果最理想的情況是從2開始的公差為1的等差數列。但是有時是無法構成這樣的等差數列的,因為構成到某一位時會出現構建下一位不夠用的情況,例如,n=6時,6=2+3+1。當我們要構成4的時候只剩下1了。如果餘數是1,那麼我們必然要加到前面的某乙個數字上,否則乘積無法增大。如果是大於1的數,也必須加在前面的某些數字上,否則如果單乘會出現重複數字。

先看看這個餘數的範圍。假設構造好的數列為2...k一共k-1個數字,那麼這個餘數必然≤k,否則可以繼續構造數列。

唯一可以避免數字重複的方法是將這些1從最大的數字開始依次向較小數分配,讓每個乘數增加1。如果餘數小於k,那麼這樣做沒問題。還有可能仍然剩餘1(餘數為k的時候),此時只能將這個1加在最大的乘數上。

#include #include #include #include #include #include using namespace std;

#define clc(s,t) memset(s,t,sizeof(s))

#define inf 0x3fffffff

#define n 1005

int n;

int s[n];

int main()

for(k = i-1;k>=1&&j;k--,j--)//從大到小構造序列

s[k] ++;

if(j)//如果仍然有剩餘

s[i-1]++;

for(k = 1;k

poj 1032 整數拆分

給你乙個n問求使得 a1 a2 ak n時 a1 a2 ak最大。a1 a2.不相等。沒看懂題目意思。以下 思路 將乙個數分成2份,如何分,使得這兩個數乘積最大。答案是將這個數平分,證明是求x n x 的最大值。基於這種思路,將n分成乘積最大的不相等的多份,應使得其中每份的數相差盡量少,即差值為1的...

poj 1032 整數拆分

好吧,又抄了一篇,嘿嘿 給你乙個n問求使得 a1 a2 ak n時 a1 a2 ak最大。a1 a2.不相等。沒看懂題目意思。我也沒看懂 以下 思路 將乙個數分成2份,如何分,使得這兩個數乘積最大。答案是將這個數平分,證明是求x n x 的最大值。基於這種思路,將n分成乘積最大的不相等的多份,應使得...

POJ 1032 解題報告

p.s.之前按照列表做,做著做著就做岔了。這裡回歸正軌。這道題後來做成了找規律題 我用遞迴搜尋不出意外地tle了 discuss 上面有好些關於規律的討論和證明,比如 知道後就簡單了很多了。這裡參考了的規律總結。thestoryofsnow 1032 accepted 144k 0msc 1028b...