Openjudge 百練 03 複雜的整數劃分問題

2021-07-15 04:47:45 字數 1408 閱讀 5617

總時間限制: 

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

這道題有三個問題,一是有個數限制的整數劃分,二是不同數的劃分,三是劃分成奇數

在考慮有限個數整數劃分時,我們可以設狀態dp[i][j],表示將整數i劃分成j個整數

那麼就有dp[i][j]=dp[i-j][j]+dp[i-1][j-1]。

dp[i-j][j]有j個整數(都不為1),每個整數都同時減1。

dp[i-1][j-1]表示當前構成i的整數中有1,去掉裡面的1。

至於劃分為不重複整數和奇數,既可以列舉整數或奇數做0-1揹包,也可以通過第乙個問題的方法轉移 dp[i][j]=dp[i-j][j-1]+dp[i][j-1]; | j<=i;(上限合適)->劃分成的數里有j+劃分成的數里沒有j

dp[i][j]=dp[i][i];                        | j>i (上限過大)

只是奇數做dp時要注意列舉情況

#include#include#includeusing namespace std;

#define maxn 50

#define maxm

#define inf 0x3f3f3f3f

typedef long long int ll;

int n,k;

ll dp[maxn+10][maxn+10];

void work1()//選k個

void work2()//任意不同 }

printf("%lld\n",dp[n][n]);//劃分n,上限為n

}void work3()//任意奇數(基本同work1)

for(int i=1;i<=n;i++)

else dp[i][j]=dp[i][j-1];//當前非奇數

} }printf("%lld\n",dp[n][n]);

}int main()

}

openjudge 百練 2802 小遊戲

描述 一天早上,你起床的時候想 我程式設計序這麼牛,為什麼不能靠這個賺點小錢呢?因此你決定編寫乙個小遊戲。遊戲在乙個分割成w h個正方格仔的矩形板上進行。如圖所示,每個正方格仔上可以有一張遊戲卡片,當然也可以沒有。當下面的情況滿足時,我們認為兩個遊戲卡片之間有一條路徑相連 路徑只包含水平或者豎直的直...

openjudge百練 電影節

傳送門 描述 大學生電影節在北大舉辦 這天,在北大各地放了多部電影,給定每部電影的放映時間區間,區間重疊的電影不可能同時看 端點可以重合 問李雷最多可以看多少部電影。輸入 多組資料。每組資料開頭是n n 100 表示共n場電影。接下來n行,每行兩個整數 0到1000之間 表示一場電影的放映區間 n ...

OpenJudge 百練2754 八皇后

description 會下西洋棋的人都很清楚 皇后可以在橫 豎 斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上 有8 8個方格 使它們誰也不能被吃掉!這就是著名的八皇后問題。對於某個滿足要求的8皇后的擺放方法,定義乙個皇后串a與之對應,即a b1b2.b8,其中bi為相應擺法中第i行皇后所...