總時間限制: 200ms 記憶體限制: 65536kb
描述
將正整數n 表示成一系列正整數之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整數n 的這種表示稱為正整數n 的劃分。
輸入
標準的輸入包含若干組測試資料。每組測試資料是一行輸入資料,包括兩個整數n 和 k。
(0 < n <= 50, 0 < k <= n)
輸出
對於每組測試資料,輸出以下三行資料:
第一行: n劃分成k個正整數之和的劃分數目
第二行: n劃分成若干個不同正整數之和的劃分數目
第三行: n劃分成若干個奇正整數之和的劃分數目
樣例輸入
5 2
樣例輸出
2
33
提示
第一行: 4+1, 3+2,
第二行: 5,4+1,3+2
第三行: 5,1+1+3, 1+1+1+1+1+1
一些想法
動規的題典型問法就是多少種,而與具體的種類無關,本體採用記憶性遞迴以提高效率,根據函式引數的多少,來建立陣列,如n分為k個正整數之和,就是將問題轉化為在前n個數中找出k個正整數之和為n,因此是乙個三維陣列,遞推關係則是dp[i][j][k]=dp[i-1][j][k]+dp[i][j-i][k-1](選擇i,但是題目意思是可以重複使用i,因此下標還是i);而對於第二問是不同整數,則變為二維陣列,dp[i][j]=dp[i-1][j]+dp[i-1][j-i](選擇i,但是題目意思是可以重複使用i,因此下標還是i);第三問是奇數,則只需要加乙個判斷條件即可,dp[i][j]=dp[i-1][j]+dp[i][j-i](判斷i是否是正奇數i%2!=0),根據遞推寫出遞迴即可,要特別注意的是,dp中的初始元素不能為0,因有的元素的值確實為0,故應小於0,如-1。
**
#include
#include
using
namespace std;
const
int max =55;
int dp1[max]
[max]
[max]=;
//dp[i][j][k]表示把j分成在前i個數字中選出k個之和的種數
intfun1
(int i,
int j,
int k)
int dp2[max]
[max]=;
intfun2
(int i,
int j)
int dp3[max]
[max]=;
intfun3
(int i,
int j)
intmain()
return0;
}
Openjudge 百練 03 複雜的整數劃分問題
總時間限制 200ms 記憶體限制 65536kb 描述 將正整數 n 表示成一系列正整數之和,n n1 n2 nk,其中n1 n2 nk 1 k 1 正整數 n 的這種表示稱為正整數 n 的劃分。輸入標準的輸入包含若干組測試資料。每組測試資料是一行輸入資料,包括兩個整數n 和 k。0 n 50,0...
openjudge 膨脹的木棍
總時間限制 1000ms 記憶體限制 65536kb 描述 當長度為l的一根細木棍的溫度公升高n度,它會膨脹到新的長度l 1 n c l,其中c是熱膨脹係數。當一根細木棍被嵌在兩堵牆之間被加熱,它將膨脹形成弓形的弧,而這個弓形的弦恰好是未加熱前木棍的原始位置。你的任務是計算木棍中心的偏移距離。輸入三...
openjudge 神奇的幻方
神奇的幻方 檢視 提交 統計 提問 總時間限制 1000ms 記憶體限制 65535kb 描述幻方是乙個很神奇的n n矩陣,它的每行 每列與對角線,加起來的數字和都是相同的。我們可以通過以下方法構建乙個幻方。階數為奇數 1.第乙個數字寫在第一行的中間 2.下乙個數字,都寫在上乙個數字的右上方 a.如...