【枚举暴搜】【NOIP2001】数的划分
第二题:数的划分
(p2.pas/c/cpp p2.in p2.out)
问题描述
将整数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;}
题目范围很小,深搜可以轻松过
主要是判重,方法有两种
①类似字符串检索,每求出一种方案就将其排序,然后判重用hash就很方便了,但是时间不理想
②枚举的时候不用从1~n,只需从上一个a[i-1]~n即可,就可以保证不重复,如果后面有小的,那么前面必定有和它重复的答案
C++ Code
#include<cstdio> #include<string> using namespace std; int n,k,ways=0; int a[300]={0}; bool h[9999999]; void fen(int i,int sum) { if(i==k)//这里直接判断最后一个是否大于等于其前面一个即可 少递归一次 不然要超时! { if(a[i-1]<=n-sum)ways++; return; } int j; if(sum==n)return; for(j=a[i-1];j<=n-sum;j++) { if(j<1)continue; a[i]=j; fen(i+1,sum+j); } } int main() { freopen("p2.in","r",stdin); freopen("p2.out","w",stdout); scanf("%d%d",&n,&k); fen(1,0); printf("%d",ways); return 0; }
..... 转载请注明出处 ..... http://oijzh.cnblogs.com ..... by jiangzh