将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种分法被认为是相同的。
1,1,5; 1,5,1; 5,1,1;
问有多少种不同的分法。
dp:
剩下的j分i份,最大的那份为k
#include<bits/stdc++.h>
using namespace std;
int f[10][201][201];
int main(){
int n,ans=0,m;
cin>>n>>m;
f[0][0][0]=1;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=j;k++)
for(int l=0;l<=k;l++)
f[i][j][k]+=f[i-1][j-k][l];
for(int i=1;i<=n;i++)
ans+=f[m][n][i];
cout<<ans<<endl;
return 0;
}
2.
#include<bits/stdc++.h>
using namespace std;
int g[505][505];
int main(){
int n,k,m;
cin>>m>>k;
for(int i=0;i<m;i++)
g[i][0]=1;
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
if(j>=i)
g[i][j]=g[i][j-i]+g[i-1][j];
else
g[i][j]=g[i-1][j];
cout<<g[k][m-k]<<endl;
return 0;
}
3.类似poj 1664 分苹果分法:
//7分3拆为6分2(最小数为1)和4分3(最小数不为1,每份去掉一个1再分)
#include<bits/stdc++.h>
using namespace std;
int dp[505][505];
int main(){
int n,ans=0,m;
cin>>n>>m;
dp[1][1]=1;
for(int i=2;i<=n;i++)
for(int j=1;j<=m;j++)
if(i>=j)
dp[i][j]=dp[i-1][j-1]+dp[i-j][j];
cout<<dp[n][m]<<endl;
return 0;
}