問題提出:
設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...