展開
將整數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...