遞推問題系列1 冪積序列

2021-09-06 01:19:41 字數 3088 閱讀 3437

問題提出:

設x,y為非負整數,試計算集合m=的元素小於指定整數n的個數,並

求這些元素從小到大排序的第m項。

以下給出案例求解的三種設計:

1.窮舉求解

設計要點:

集合元素由2的冪與3的冪及其乘積組成,設元素從小到大排序的第k項為f(k)。顯然,f(1)=1,f(2)=2。

設定a從3開始遞增至n迴圈,對每乙個a(賦值給j),逐次試用2試商,然後逐次試用3試商。

試商後若j>1,說明原a有2,3以外的因數,不屬於該序列。

若j=1,說明原a只有2,3的因數,為序列第k項賦值。

由於實施從小到大窮舉賦值,所得項無疑是從小到大的序列。

當達到指定的n,退出迴圈,輸出指定項f(m)。

1#include 

<

stdio.h

>

2void

main()316

}                     

17printf(

"冪序列中小於%ld的項數為:%d\n

",n,k); 

18if

(m<=

k)19

printf(

"從小到大排序的第%d項為:%ld\n

",m,f[m]); 

20else

21printf(

"所輸入的m大於序列的項數!\n");

22}23

2.遞推排序求解

設計要點:

為探索x

+y=i時各項與x

+y=i

−1時各項之間的遞推規律,剖析x

+y的前若干項情形:

x+y=0

時,元素為1

(初始條件);

x+y=1

時,元素為2*1=2,3*1=3,共2項;

x+y=2

時,序列有2*2=4,2*3=6,3*3=9,共3項;

x+y=3

時,序列有2*2*2=8,2*2*3=12,2*3*3=18,3*3*3=27,共4項;

……可歸納出以下遞推關係:

x+y=i

時,序列共i

+1項,其中前i項是x

+y=i

−1時的所有i項分別乘2所得;最後一項為x

+y=i

−1時的最後一項乘3所得(即t=3^i)。

注意,對x

+y=i−1

的所有i項分別乘2,設為

f[h]*2

,必須檢測是否小於n而大於0。同樣,對t也必須檢測是否小於n而大於0。只有小於n且大於0時才能賦值。

這裡要指出,最後若干行可能不是完整的,即可能只有前若干項能遞推出新項。為此設定變數u: 當一行有遞推項時u=1;否則u=0。只有當u=0時停止,否則會影響序列的項數。

**如下: 

1#include 

<

stdio.h

>

2void

main()3 

19else

break

;     20}

21t=t

*3;                 

//最後一項為3的冪  

22if

(t<

n &&

t>0)

23        

//用t給f[k]賦值          

24if

(u==0) 

break

; 25i++

;26}27

for(i=1

;i<

k;i++

)        

//逐項比較排序  

28for(j=

i+1;j

<=

k;j++)29

if(f[i]

>

f[j])

30    

31printf(

"冪序列中小於%f的項數為:%d\n

",n,k); 

32if

(m<=

k)33

printf(

"從小到大排序的第%d項為:%.0f\n

",m,f[m]); 

34else

35printf(

"所輸入的m大於序列的項數!\n");

36}37

3.遞推結合比較賦值求解

設計要點:

從u=1, f(u)=1開始, 在已求得f(u)的基礎上,可遞推地求出f(u+1):求出各大於f(u)的最小數, 取其中最小者即為f(u+1)。

遞推結合比較賦值設定永真外迴圈,實施乘2的內迴圈。

首先,從p=0開始,若

q[p]<=f[u]

,則遞推得乙個3的冪即q[p]=3^p,並賦給最小值標誌量h。

然後轉入內迴圈i(0——p-1)中,若q[i]<=f[u],則q[i]乘2,即q[i]=2*q[i]。

然後q[i]與h比較,即2^j*3^i(i)與3^p比較,取較小者為h。

若h≤n,則h賦值給序列新的項,用u標記的項數。

若h>n,表明遞推結合比較賦值完成,退出外迴圈,輸出序列的項數u與序列中指定的項f[m]後結束。

**如下:

1#include 

<

stdio.h

>

2void

main()314

h=q[p];                      

//遞推3的冪,q[p]=3^p  

15for(i=

0;i<

p;i++)16

19if

(h>

n) break;20

u++;f[u]

=h;      21}

22printf(

"冪序列中小於%.0f的項數為:%d\n

",n,u);  

23if

(m<=

u)24

printf(

"從小到大排序的第%d項為:%.0f\n

",m,f[m]); 

25else

26printf(

"所輸入的m大於序列的項數!\n");

27}28

遞推問題合集

首先講一道小時候的遞推問題,如上所示,這裡,凡是問到第n次的時候,有幾種方式或者需要走幾步,就應該想到遞推地方法了。首先求出f 1 1,f 2 2。這時候想求f 3 這時候想,第一步可以走一步,或者兩步,如果走一步的話,還有兩步可以走,那麼恰好就是f 2 種情況。如果走兩步的話,還剩一步,那麼恰好就...

學習筆記 遞推問題選講

要將a上所有圓盤移到c,並且過程中不能出現大的圓盤在小的圓盤上面的情況.把除了最大的之外的圓盤從a移到b.f n 1 把最大的從a移到c.1 把除了最大的之外的圓盤從b移到c.f n 1 通式 f n f n 1 times2 1 求用對角線將n邊形劃分成 n 2 個三角形的不同的方案數.通式 f ...

數塔問題 動態規劃問題 遞推問題

圖是乙個數塔,要求找出一條路徑,使路徑上的陣列和最大 第一行是乙個整數n,表示數塔的高度,接下來用n行數字表示數塔,其中第i行有i個整數,且所有的整數均在區間 0,99 內 output 輸出可能得到的最大和 sample input 57 3 88 1 0 2 7 4 4 4 5 2 6 5 sa...