OpenJudge 015 複雜的整數劃分問題

2021-10-05 06:22:39 字數 1536 閱讀 6056

總時間限制: 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.如...