演算法 動態規劃

2021-10-07 16:38:30 字數 1726 閱讀 3437

給定乙個整數n,將其無序拆分成最大數為k的拆分數,(n,k不超出100) 要求:所有的拆分方案不重複。 如當n=4,k=4時,一共有5種拆分方案,拆分如下:

(1)4=1+1+1+1

(2)4=1+1+2

(3)4=1+3

(4)4=2+2

(5)4=4

輸入格式:

每一行輸入一組整數n,k,遇到鍵盤結束符^z或檔案結束符eof時結束輸入。

輸出格式:

按行輸出每組的拆分方案數。

輸入樣例:

4,4 5,4

輸出樣例:

5 6

程式中的df[n][k]的值就是使用者輸入n,k,後要輸出的值

程式的關鍵是怎麼讓後面的元素用前面的元素表示出來

把題目用(n,k)=c來表示,再把k大於n的情況考慮進去,會得到下表

(1,1)=1 (1,2)=1 (1,3)=1 (1,4)=1

(2,1)=1 (2,2)=2 (2,3)=2 (2,4)=2

(3,1)=1 (3,2)=2 (3,3)=3 (3,4)=3

(4,1)=1 (4,2)=3 (4,3)=4 (4,4)=5

(5,1)=1 (5,2)=3 (5,3)=5 (5,4)=6

從中找規律,讓後面的元素用前面的元素表示

可以得到規律如下:

當k=1時,(n,k)=1,這些就是最基礎的元素了

當k>n時,(n,k)=(n,k-1)

當k#include

#include

int n[

100]

[100];

intmain()

。//當k==1時,無論n為何值,都只有一種拆分方案。即。因為拆分的最大數不能超過k,所以只能拆成1。

if(i==

1||j==1)

//當n==k時

//根據拆分出來的數是否包含n,可以分成兩種情況。

//拆分出來的整數包含n,那就只有一種情況,即。

//拆分出來的整數不包含n,那麼這些拆分出來的數中,一定比n小,即n的所有(n-1)拆分。因此dp[n][k]=1+dp[n][k-1];

else

if(i==j)

//當n//因為拆分出來的最大數永遠不可能達到k。所以等價於n的所有n拆分。因此dp[n][k]=dp[n][n];

else

if(i//當n>k時

//根據拆分出來的整數中是否包含k,可以分為兩種情況:

//拆分出來的整數中包含k,即),其中的和為n-k,

//可能再次出現k,因此是(n-k)的k拆分。因此這種情況的拆分數是dp[n-k][k]。

//拆分出來的整數中不包含k的情況,則拆分出來的整數中所有值都比k小,即n的(k-1)劃分。拆分數為dp[n][k-1]。

//所以dp[n][k]=dp[n-k][k]+dp[n][k-1]。

else

if(i>j)}}

printf

("%d\n"

,n[n]

[k]);}

}

演算法 動態規劃

動態規劃 把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解 演算法例子 1.鋼條切割 serling 公司購買長鋼條,將其切割為短鋼條,切割工序假設沒有成本支出,公司管理層希望確定最佳的切割方案。假設serling公司 一段長度為i英吋的鋼條的 為pi。鋼條的長度為整英吋,下表給出...

演算法 動態規劃

1 問題具有最優子結構性質。如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質。比如說在揹包問題中,最高總價值 max 選擇不放該物品時達到的總價值,決定放該物品時揹包剩餘容量能達到的最大價值 該物品價值 顯然,最高總價值的解一定包含 選擇不放該物品時達到的總價值 和 決...

演算法 動態規劃

動態規劃的定義 動態規劃是運籌學的乙個分支,是求解決策過程的最優化的數學方法。20世紀50年代初美國數學家r.e.bellman等人在研究多階段決策過程的優化問題時,提出了著名的最優化原理,把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解,創立了解決這類過程優化問題的新方法 動態規...