标签:pac 个数 default 转化 output define i++ end problem
将整数n分成k份,且每份不能为空,任意两种划分方案不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种划分方案被认为是相同的。
1 1 5
1 5 1
5 1 1
问有多少种不同的分法。
输入:n,k (6<n<=200,2<=k<=6)
输出:一个整数,即不同的分法。
7 3
4
{四种分法为:1,1,5;1,2,4;1,3,3;2,2,3;}
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define N 300 using namespace std; int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘) f=-1; ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘) {x=x*10+ch-‘0‘; ch=getchar();} return x*f; } int n,k,ans,dp[N][N]; int main() { n=read(),k=read(); dp[0][0]=1; for(int i=1;i<=n;i++) for(int j=1;j<=min(i,k);j++) dp[i][j]=dp[i-j][j]+dp[i-1][j-1]; ans=dp[n][k]; printf("%d",dp[n][k]); return 0; }
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define N 300 using namespace std; int n,m,ans,b[N]; int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘) f=-1; ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘) {x=x*10+ch-‘0‘; ch=getchar();} return x*f; } int dfs(int k,int end,int begin) { if(k==m) { if(end>=begin) ans++; return 0; } for(int i=begin;i<end;i++) { b[k]=i; dfs(k+1,end-i,i); } } int main() { n=read();m=read(); dfs(1,n,1); printf("%d",ans); return 0; }
标签:pac 个数 default 转化 output define i++ end problem
原文地址:http://www.cnblogs.com/z360/p/7216787.html