演算法分析與設計學習筆記5之整數拆分問題

2022-09-04 06:39:09 字數 2287 閱讀 4139

老規矩步入正題之前先說點兒題外話,今天老師講的東西感覺沒什麼需要記錄的,所以今天就把之前老師布置的乙個作業拿出來分析一下吧,水一篇文章,畢竟好幾天沒更新了,話不多說,上題

整數劃分問題。把正整數n表示成一系列正整數的和,n=n1+n2+n3+...+ni,這種表示成為n的劃分,不同的劃分個數稱為正整數n的劃分數,如6有11種劃分。設計演算法,輸出n的劃分數和具體的劃分方法(用遞迴的方法)。

這個題目乍一看,給我的第一感覺,啥玩意啊,咋感覺雲裡霧裡的,細看,哦,原來就是小學的一道題,大致意思就是讓你將數字拆分。並輸出拆分的結果和拆分的數量

比如,輸入6輸出

1+1+1+1+1+1

1+1+1+1+2

1+1+1+3

1+1+2+2

1+1+4

1+2+3

1+52+2+2

2+43+3

6然後輸入分類的種數為11

如果拋開問題來講這個問題存在兩種解決方法,一是使用遞推來完成,二是使用遞迴的方法實現,遞推的方法沒什麼好講的,所以我就只講遞迴的演算法思想。

所謂遞迴就是程式呼叫自身,最常見的例子就是斐波那契函式(作者後續可能會更新一篇文章專門來講斐波那契函式),對於這個題目我們需要定義乙個函式然後讓這個函式不斷呼叫它本身完成數字拆分,我們需要將問題分成兩部分來進行,一是進行運算,二是將運算出來的資料進行儲存,即我們邊把資料運算出來,邊把資料儲存到乙個地方,然後將資料輸出,就這樣重複來使整數整個拆分開來,我空口說可能大家聽起來比較暈,所以我直接上**吧

import sys

def divide(n, m):

global list

global p

global z

if n == 0:

for i in range(p):

print(list[i], end="")

if i == p-1:

continue

else:

print("+", end="")

z += 1

print("")

for i in range(m, n+1):

list[p] = i

p += 1

divide(n-i, i)

p -= 1

if __name__ == '__main__':

while(1):

print("please input the number you want to divide(input zero or negative exit):",end="")

n = int(input())

if (n < 0 or n == 0):

print("welcome to use next time")

sys.exit(1)

z = 0

list = [0] * n

m = 1

p = 0

print("the result is:")

divide(n, m)

print("there are %d ways to divide the number"%z)

# include # include # define x 100

int z = 0;

int m = 1;

int p = 0;

int list[x];

void divide(int n ,int m)

z++;

printf("\n");

} for(int j = m; j < n+1; j++) }

void main()

for(int i = 0; i < x;i++)

printf("the result is:\n");

divide(n,m);

printf("the are %d ways to divide the number\n",z);

}}

**中的那個大迴圈我是為了能夠讓這個程式迴圈使用,如果說僅僅是單次使用可以不加,僅僅看**可能不會很清楚,我給列為看官的建議是帶上乙個數字跑一下,整個過程就都明白了,在這裡我就不贅述了

一笑不琅然乙個專注於搞事情的的大學it男

演算法分析與設計學習筆記 5

貪心演算法 在求最優解問題的過程中,依據某種貪心標準,從問題的初始狀態出發,直接去求每一步的最優解,通過若干次的貪心選擇,最終得出整個問題的最優解,這種求解方法就是貪心演算法。從貪心演算法的定義可以看出,貪心演算法不是從整體上考慮問題,它所做出的選擇只是在某種意義上的區域性最優解,而由問題自身的特性...

演算法分析與設計學習筆記1

下面哪乙個不是演算法的特性?同乙個數學模型使用不同的資料結構會有不同的演算法,有效性有很大差別 計算此偽 表示的演算法中加法的執行次數 答案 2t 1 1 解析 此類問題適合初學者進行練習,初學者接觸此類問題最好找從頭到尾梳理一遍,將題中所給資料帶入所給偽 中進行計算來梳理思路。運算過程 n最開始為...

演算法設計與分析學習筆記(一)

輸入包含n個整數是陣列a和整數x,求出滿足a i a j x的i和j,如果沒有這樣的元素和,則返回 1,否則返回1 暴力法 思路 設定兩個for迴圈,第乙個設定基準數,然後利用已知數x減去基準數之後,再使用乙個for迴圈來進行匹配減去得到的數,如果存在該數,則返回1.如果不存在,則繼續找下乙個基準數...