數的劃分問題總結 DP或遞迴

2021-10-02 17:09:57 字數 1127 閱讀 5653

問題 1531: [藍橋杯][演算法提高vip]數的劃分

時間限制: 1sec 記憶體限制: 128mb 提交: 438 解決: 175

題目描述

乙個正整數可以劃分為多個正整數的和,比如n=3時:

3;1+2;1+1+1;

共有三種劃分方法。

給出乙個正整數,問有多少種劃分方法。

資料規模和約定

n< =100

輸入乙個正整數n 

輸出乙個正整數,表示劃分方案數 

樣例輸入

3
樣例輸出

3
思路1:

將n劃分成若干個數,定義f(n,m)為n個數中,劃分的數最大<=m的劃分總數,那麼:

1、n==m時,其個數就相當於1+f(n,n-1),分別是放m的情況數和不放m的情況數。

2、m>n,即等於f(n,n)。

3、n>m,那麼可以分為含有m,不含m的情況,即f(n-m,m)(因為含有m,其他的數就是n-m啦),f(n,m-1)。

4、n==1||m==1,只有一種劃分方法。

同時要加上記憶化才能通過本題

**1:

#include#include#define rep(i,a,b) for(int i=a;i<=b;i++)

#define dep(i,a,b) for(int i=a;i>=b;i--)

#define ll long long

#include#include#include#includeusing namespace std;

const int maxn=500+6;

#define mod 1000000007

#define inf 0x3f3f3f3f

int n;

/*int dfs(int x,int s)

return ans;}*/

int vis[maxn][maxn];

int dfs2(int n,int m)

int main()

int main()

int dp[maxn][maxn];

int main()

}rep(i,1,n)

cout<}

數的劃分問題 DP

問題 把乙個整數n分成k份,每份都不為0,有幾種分法?分析 情況分為兩類 一 每份中不包含1的方法,為保證每份 2,先拿出k個1到每乙份,然後把剩下的n k分為k份,分法有dp n k k 二 至少有乙份包含1,拿出1個當為乙份。剩下的n 1個分為k 1份,分法有dp n 1 k 1 include...

數的劃分 DP

link 解題思路設fi,jf fi,j 為i ii個數分成j jj份的合法方案數 當我們枚到i ii時劃分方法有兩種 第i ii個數單獨成為大小為1的乙份,所以方案數為fi 1,j 1f fi 1,j 1 因為求得是組合,不可以重複方案,我們可以從fi j,jf fi j,j 轉移過來,把i j ...

數的劃分(遞迴)

整數劃分是另外的問題 將整數n分成k份,且每份不能為空,任意兩種劃分方案不能相同 不考慮順序 例如 n 7,k 3,下面三種劃分方案被認為是相同的。7 1 1 5 7 1 5 1 7 5 1 1 問有多少種不同的分法。輸入 n,k 1 n 200,1 k 6 輸出 乙個整數,即不同的分法 7 3 四...