标签:
将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整数n 的这种表示称为正整数n 的划分。
5 2
2 3 3
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int n,k,ans; int f[55][55]; void xx() { ans=0; memset(f,0,sizeof(f)); } int main() { while (scanf("%d%d",&n,&k)==2)//读入几个数,就等于几 { //第一问 xx(); for (int i=0;i<=n;i++) { f[i][1]=1; f[i][i]=1; } for (int i=2;i<=n;i++) for (int j=2;j<=k;j++) { f[i][j]=f[i-1][j-1]; if (i-j>=j) f[i][j]+=f[i-j][j]; } cout<<f[n][k]<<endl; //第二问 xx(); for (int i=1;i<=n;i++) f[i][1]=1; for (int j=2;j*(j+1)/2<=n;j++) for (int i=j*(j+1)/2;i<=n;i++) for (int k=1;k*j+j*(j-1)/2<=i;k++) f[i][j]+=f[i-j*k][j-1]; for (int j=1;j*(j+1)/2<=n;j++) ans+=f[n][j]; cout<<ans<<endl; //第三问 xx(); for (int i=1;i<=n;i++) if (i%2) { f[i][1]=1; f[i][2]=0; } else { f[i][1]=0; f[i][2]=(i/2+1)/2; } for (int i=3;i<=n;i++) for (int j=1;j<=i;j++) { f[i][j]=f[i-1][j-1]; if (i-2*j>=j) f[i][j]+=f[i-2*j][j]; } for (int i=1;i<=n;i++) ans+=f[n][i]; cout<<ans<<endl; } }
标签:
原文地址:http://www.cnblogs.com/sjymj/p/5385436.html