#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是相同的,只計算為一種方法。如果計...