動態規劃求解整數拆分問題

2021-10-02 22:33:00 字數 1521 閱讀 9724

#include

#define maxn 10

//採用動態規劃求解整數拆分問題。

//設f(n,k)為n的k拆分的拆分方案個數:

//其中,n表示被劃分的數,k表示被劃分出來的數中的可能出現的最大值,

// f(n,k)的值表示劃分的方法個數

//(1)當n = 1或者k = 1時,顯然f(n,k) = 1。

//(2)當n//(3)當n = k時,

// 其拆分方案有將正整數n無序拆分成最大數為n - 1的拆分方案,

// 以及將n拆分成1個n(n = n)的拆分方案,後者僅僅一種,

// 所以有f(n,n) = f(n,n - 1) + 1。

//(4)當n>k時,根據拆分方案中是否包含k,可以分為兩種情況:

// ① 拆分中包含k的情況:即一部分為單個k,

// 另外一部分為,後者的和為n - k,

// 後者中可能再次出現k,因此是(n - k)的k拆分,

// 所以這種拆分方案個數為f(n - k,k)。

// ② 拆分中不包含k的情況:

// 則拆分中所有拆分數都比k小,即n的(k - 1)拆分,

// 拆分方案個數為f(n,k - 1)。

int dp[maxn]

[maxn]

;//動態規劃陣列

//劃分方法

// f(n,k) = 1 當n = 1或者k = 1

// f(n,k) = f(n,n) 當n < k

// f(n,k) = f(n,n - 1) + 1 當n = k

// f(n,k) = f(n - k,k) + f(n,k - 1) 當n < k

void

split

(int n,

int k)

//求解演算法

}int

fun(

int n,

int k)

//求解演算法

int dp_2[maxn]

[maxn]

;int

dpf(

int n,

int k)

//求解演算法

else

if(n < k)

else

if(n == k)

else

}int

main()

printf

("\n");

}printf

("\n遞迴法求解:\n");

printf

("%3d"

,fun

(n, k));

printf

("\n備忘錄法求解:\n");

dpf(n, k)

;for

(i =

1; i <= n; i++

)printf

("\n");

}return0;

}

動態規劃 整數拆分

時間限制 1秒 空間限制 65536k 熱度指數 8566 乙個整數總可以拆分為2的冪的和,例如 7 1 2 4 7 1 2 2 2 7 1 1 1 4 7 1 1 1 2 2 7 1 1 1 1 1 2 7 1 1 1 1 1 1 1 總共有六種不同的拆分方式。再比如 4可以拆分成 4 4,4 1...

動態規劃 整數拆分(純DP)

name 整數拆分 兩種做法 dp actor ht time 2015年9月28日 error reporte 1.初始化邊界處理 沒弄清 include include include include include include using namespace std define n 12...

python 動態規劃實現整數拆分

我們先來看這樣乙個問題 把5拆分成若干無序正整數的和 若干可以包含1 請問有多少種拆分方法?直接用列舉法實現 5 5 5 4 1 5 3 2 5 3 1 1 5 2 2 1 5 2 1 1 1 5 1 1 1 1 1 很顯然,結果為7。注意這裡5 4 1和5 1 4是相同的,只計算為一種方法。如果計...