P1025 數的劃分

2021-09-26 07:16:44 字數 1342 閱讀 7386

展開

將整數nn分成kk份,且每份不能為空,任意兩個方案不相同(不考慮順序)。

例如:n=7n=7,k=3k=3,下面三種分法被認為是相同的。

1,1,51,1,5;

1,5,11,5,1;

5,1,15,1,1.

問有多少種不同的分法。

n,kn,k (611個整數,即不同的分法。

四種分法為:

1,1,51,1,5;

1,2,41,2,4;

1,3,31,3,3;

2,2,32,2,3.

//dfs版本

#include using namespace std;

int n=0,m=0,l=0,ans=0,a[1000000];

void dfs(int last,int sum,int step)

for(int i=last;sum+i*(m-step)<=n;i++)//剪枝,由於搜尋步數遞增,過多的不必搜尋

dfs(i, sum+i, step+1);

}int main()

遞推: a[i][j]代表在數的和為i的情況下分為j組共有的情況數。

由於無論在數的和為幾時,把它們分成0組都是0種情況,分成一組都是一種情況,

所以j=0時全部要初始化為0,j=1時全部要初始化為1。

同時,無論共分為幾組,數的和為0和1是0種情況(i=j=1除外)

所以i=0或i=1時j從2開始全部初始化為0。

對於剩下的任意乙個a[i][j],都可以用如下方式求得:

a[i][j] =第乙個數為1的所有情況+第乙個數不為1的所有情況。

第乙個數為1時,1占用了1個位置和占用了總數中的1是已經確定了的,

因此,第乙個數為1的所有情況=a[i-1][j-1]。

第乙個數不為1時,可以視為先在所有的位置上都加上乙個1再對於所有的位置用新的總數求次數,

所以定了的是占有了總數j個,位置仍然是j個,與原來相比沒有變化。

因此,第乙個數不為1的所有情況=a[i-j][j]。

所以a[i][j]=a[i-1][j-1]+a[i-j][j]。

#include using namespace std;

int n=0,m=0,l=0,ans=0,a[1000][1000];

int main()

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

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

a[i][j]=a[i-1][j-1]+a[i-j][j];

cout

}

P1025 數的劃分

將整數nn分成kk份,且每份不能為空,任意兩個方案不相同 不考慮順序 例如 n 7n 7,k 3k 3,下面三種分法被認為是相同的。1,1,51,1,5 1,5,11,5,1 5,1,15,1,1.問有多少種不同的分法。輸入格式 n,kn,k 6輸出格式 11個整數,即不同的分法。include d...

P1025 數的劃分

題目描述 將整數n分成k份,且每份不能為空,任意兩個方案不相同 不考慮順序 例如 n 7,k 3,下面三種分法被認為是相同的。1,1,5 1,5,1 5,1,1 問有多少種不同的分法。輸入格式 n,k 6輸出格式 1個整數,即不同的分法。輸入輸出樣例 輸入 1 7 3 輸出 1 說明 提示 四種分法...

P1025 數的劃分

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