日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

整数划分递归相关问题

發(fā)布時(shí)間:2024/9/21 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 整数划分递归相关问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?算法設(shè)計(jì)----整數(shù)劃分遞歸相關(guān)問(wèn)題

一.原問(wèn)題

整數(shù)劃分,是指把一個(gè)正整數(shù)n寫成如下形式:

假設(shè)整數(shù)n,能被劃分為i段n=a1+a2+...ai,其中ak為n中劃分的最大整數(shù)(1<=ak<=n,1<=k<=i),則{a1,a2...ai}是n的ak的一個(gè)劃分

當(dāng)n=6時(shí)我們可以獲得以下這幾種劃分

一共有11種

分析:討論整數(shù)n和劃分的最大整數(shù)m的關(guān)系,可以分為以下幾種情況:

? ? ? ?①當(dāng)整數(shù)n==1,只有一種劃分,即{1}

? ? ? ?②當(dāng)劃分的最大整數(shù)m==1時(shí),只有一種劃分,即{1,1......1}

? ? ? ?③當(dāng)n<m時(shí),整數(shù)n可以劃分的最大的數(shù)為n,即f(n,n)種劃分

? ? ? ?④當(dāng)n==m時(shí),根據(jù)需不需要?jiǎng)澐肿畲笳麛?shù)m,可以分為兩種情況:

? ? ? ? ? ? ? a:需要?jiǎng)澐肿畲笳麛?shù)為m,只有一種劃分,即{m}

? ? ? ? ? ? ? b:不需要?jiǎng)澐肿畲笳麛?shù)為m,即可能劃分的最大整數(shù)為m-1,即有f(n,m-1)種劃分

? ? ? ?⑤當(dāng)n>m時(shí),根據(jù)需不需要?jiǎng)澐肿畲笳麛?shù)m,可以分為兩種情況:

? ? ? ? ? ? ? a:需要?jiǎng)澐肿畲笳麛?shù)為m,所以繼續(xù)在n-m中劃分,劃分的最大整數(shù)還可能為m,所以有f(n-m,m)種劃分

? ? ? ? ? ? ? b:不需要?jiǎng)澐肿畲笳麛?shù)為m,所以劃分的最大整數(shù)可能為m-1,即有f(n,m-1)種劃分

? ? ? ?綜上所述的轉(zhuǎn)移狀態(tài)方程:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1? ? ? ? ? ? ? ? ? 當(dāng)?n==1或 m==1時(shí)

? ? ? ? ? ? ? f(n,m)=? ? ?f(n,n)? ? ? ? ? ?當(dāng)n<m時(shí)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1+f(n,m-1)? ?當(dāng)n==m時(shí)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?f(n-m,m)+f(n,m-1)? ?當(dāng)n>m時(shí)

python源代碼:

? #整數(shù)劃分問(wèn)題 #假設(shè)整數(shù)n,能被劃分為i段n=a1+a2+...ai,其中ak為n中劃分的最大整數(shù)(ak<=n,k<=i),其中{a1,a2...ai}是n的ak的一次劃分 #現(xiàn)在求整數(shù)n能夠劃分成多少種 def huafen(n,m): #n為整數(shù),m為劃分的最大整數(shù),m<=nif(n==1 or m==1):return 1elif n==m:return 1+huafen(n,m-1) elif(n<m):return huafen(n,n)else:return huafen(n,m-1)+huafen(n-m,m)a=[] t=0 def digui(sum,k,m,l):global aglobal tif(sum>l):returnelif(sum==l):t+=1print("第",t,"種:")for x in range(len(a)-1):print(str(a[x])+"+",end="")print(a[-1])else:c=range(m)for y in reversed(c):y+=1sum+=y a.append(y) #加入到a列表中digui(sum,k+1,y,l) #遞歸調(diào)用a.pop() #出列表,恢復(fù)現(xiàn)場(chǎng),回溯sum-=y #恢復(fù)現(xiàn)場(chǎng),回溯def main():print("請(qǐng)輸入一個(gè)整數(shù):")v=int(input())p=huafen(v,v)print("該整數(shù)的劃分一共有"+str(p)+"種")print("所有的劃分如下:")digui(0,0,v,v)main()?

運(yùn)行結(jié)果如下:

二.變形1

如果限制每一個(gè)劃分的整數(shù)不能一樣,即劃分的每一個(gè)整數(shù)不同? ,則又有多少種劃分呢?

其實(shí)我們只需在原問(wèn)題進(jìn)行修改即可:

①當(dāng)m==1時(shí),我們需要設(shè)置{1,1,1,....1}為0種

②當(dāng)n>m時(shí),我們需要修改的是當(dāng)需要選取最大整數(shù)m時(shí)? ,我們將最大值m-1,即f(n-m,m-1)?種

其余的不需要修改? ?

pythoon源碼:

#整數(shù)劃分變形問(wèn)題 def huafen(n,m): #n為整數(shù),m為劃分的最大整數(shù),m<=nif(n==1):return 1elif(m==1): #當(dāng)m==1時(shí),設(shè)置1,1,1.....1}為0種return 0elif n==m:return 1+huafen(n,m-1)elif(n<m):return huafen(n,n)else:return huafen(n,m-1)+huafen(n-m,m-1) #使下次劃分的整數(shù)小于上次的劃分的最大整數(shù)a=[] t=0 def digui(sum,k,m,l):global aglobal tif(sum>l):returnelif(sum==l):t+=1print("第",t,"種:")for x in range(len(a)-1):print(str(a[x])+"+",end="")print(a[-1])else:c=range(m)for y in reversed(c):y+=1sum+=ya.append(y)digui(sum,k+1,y-1,l) #這里需要將下一次的最大劃分整數(shù)修改為上一次劃分最大整數(shù)-1,不能與上一次相同a.pop()sum-=ydef main():print("請(qǐng)輸入一個(gè)整數(shù):")v=int(input())p=huafen(v,v)print("該整數(shù)的劃分一共有"+str(p)+"種")print("所有的劃分如下:")digui(0,0,v,v) main()

運(yùn)行結(jié)果如下:

三.變形2

如果限制每次劃分的整數(shù)的個(gè)數(shù)?,則又有多少種劃分呢?(類似與盤子分蘋果問(wèn)題)

(其中n為整數(shù),每次劃分只能劃分為m個(gè)數(shù))

分析:①當(dāng)m==1時(shí),只有一種劃分,即{n}

? ? ? ? ? ?②當(dāng)n<m時(shí),由于劃分的整數(shù)不可能為負(fù)數(shù)和小數(shù),則劃分不盡,所以為0

? ? ? ? ? ?③當(dāng)n==m時(shí),也是只有一種劃分。即{1,1,1,1...1}

? ? ? ? ? ?④當(dāng)n>m時(shí),根據(jù)劃分的整數(shù)中是否包含1,可以分為兩種情況:

? ? ? ? ? ? ? ? ?a:劃分的整數(shù)中至少有一個(gè)1,則在n-1中繼續(xù)劃分為m-1份,即f(n-1,m-1)種劃分

? ? ? ? ? ? ? ? ?b:劃分的整數(shù)中沒(méi)有1,所以m個(gè)部分劃分的整數(shù)必須都大于1,所以先給m個(gè)部分設(shè)為1,接著將剩余的n-m整數(shù)對(duì)m個(gè)部分分別加數(shù),即要保證m個(gè)部分均大于1,即n-m>=m,則總共有f(n-m,m)種;如果n-m<m,則f(n-m,m)為0,所以條件②不能省略

? ? ? ? ? 綜上所述方程:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1? ? 當(dāng)m==1 或者 n==m 時(shí)

? ? ? ? ? ? ?f( n,m) =? ? 0? ?當(dāng)m>n時(shí)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? f(n-1,m-1)+f(n-m,m)? ? 當(dāng)n>m時(shí)

python源代碼:

#整數(shù)劃分變形問(wèn)題 def huafen(n,m): #n為整數(shù),m為每次劃分的整數(shù)個(gè)數(shù)if(m==1 or n==m):return 1elif(m>n): #當(dāng)m>n時(shí)return 0else:return huafen(n-1,m-1)+huafen(n-m,m) #選取至少有一個(gè)1和不選取1的種數(shù) a=[] t=0 def digui(sum,k,m,l,q):global aglobal tif(sum>l):returnelif(k==q and sum==l):t+=1print("第",t,"種:")for x in range(len(a)-1):print(str(a[x])+"+",end="")print(a[-1])else:c=range(m)for y in reversed(c):y+=1sum+=ya.append(y)digui(sum,k+1,y,l,q) a.pop()sum-=ydef main():v,g=map(int,input("請(qǐng)輸入兩個(gè)以空格隔開(kāi)的數(shù):").split()) #整數(shù)v,和每次劃分的整數(shù)個(gè)數(shù)gp=huafen(v,g) print("該整數(shù)的劃分一共有"+str(p)+"種")print("所有的劃分如下:")digui(0,0,v,v,g) main()

?運(yùn)行結(jié)果如下:

?三.變形3? ?

? 如果n劃分成若干個(gè)奇正整數(shù)之和?,則這樣有多少種劃分?

?? ? ? (f(n,m)代表有多少種劃分,其中n為整數(shù),m為不大于n的最大整數(shù)的劃分)

分析:當(dāng)m==1時(shí),只有一種劃分,即{1,1,...1}

? ? ? ? ? ?②當(dāng)m為奇數(shù)時(shí):根據(jù)m和n的關(guān)系可以分成三種情況

? ? ? ? ? ? ? ? ? ? a.當(dāng)n<m時(shí),則有f(n,n)種劃分

? ? ? ? ? ? ? ? ? ? b.當(dāng)n==m時(shí),根據(jù)是否選取最大整數(shù)m,可以分成兩種情況

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?*選取最大奇整數(shù)m,則只有一種劃分,即{m}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *不選取最大奇整數(shù)m,則共有f(n,m-2)種劃分

? ? ? ? ? ? ? ? ? ? ?c.當(dāng)n>m時(shí),根據(jù)是否選取最大整數(shù)m,可以分成兩種情況

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *選取最大奇整數(shù)m,則共有f(n-m,m)種劃分

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *不選取最大奇整數(shù)m,則共有f(n,m-2)種劃分

? ? ? ? ? ?③當(dāng)m為偶數(shù)時(shí):根據(jù)m和n的關(guān)系可以分成三種情況:

? ? ? ? ? ? ? ? ? ? a.當(dāng)n<m時(shí),可以分成兩類:(m為偶數(shù),則m-1為最大奇數(shù))

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *當(dāng)n<m-1時(shí),則共有f(n,n)種劃分

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *當(dāng)n==m-1時(shí),則共有f(n,m-1)種劃分

? ? ? ? ? ? ? ? ? ? b.當(dāng)n==m時(shí),則共有f(n,m-1)種劃分

? ? ? ? ? ? ? ? ? ? ?c.當(dāng)n>m時(shí),根據(jù)是否選取最大奇整數(shù)m-1,可以分成兩種情況

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *選取最大奇整數(shù)m-1,則共有f(n-m+1,m-1)種劃分

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *不選取最大奇整數(shù)m-1,則共有f(n,m-3)種劃分

python源代碼:

def huafen(n,m): #n為整數(shù),huafen(n,m)代表:m為劃分的最大整數(shù)共有多少種,m<=nif(m==1): #若m==1return 1elif (m%2): #若m為奇數(shù)if(n<m): #n<mreturn huafen(n,n)elif(n==m): #是否選取最大奇整數(shù)mreturn 1+huafen(n,m-2)else: #是否選取最大奇整數(shù)mreturn huafen(n-m,m)+huafen(n,m-2)else: #若m為偶數(shù)if(n<m):if(n<m-1):return huafen(n,n)else:return huafen(n,m-1)elif(n==m):return huafen(n,m-1)else: #是否選取最大奇整數(shù)m-1return huafen(n-m+1,m-1)+huafen(n,m-3) a=[] t=0 def digui(sum,k,m,l):global aglobal tif(sum>l):returnelif(sum==l):flg=1for x in a: #在原問(wèn)題答案的基礎(chǔ)下,挑選出整數(shù)全部都是偶數(shù)的列表if(x%2==0):flg=-1breakif(flg==1):t+=1print("第",t,"種:")for x in range(len(a)-1):print(str(a[x])+"+",end="")print(a[-1])else:c=range(m)for y in reversed(c):y+=1sum+=ya.append(y)digui(sum,k+1,y,l)a.pop()sum-=ydef main():print("請(qǐng)輸入一個(gè)整數(shù):")v=int(input())p=huafen(v,v)print("該整數(shù)的劃分一共有"+str(p)+"種")print("所有的劃分如下:")digui(0,0,v,v) main()

運(yùn)行結(jié)果如下:

? ? ? ? ?

?

? ? ? ? ?

?

?

總結(jié)

以上是生活随笔為你收集整理的整数划分递归相关问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。