【枚举暴搜】【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
浙公网安备 33010602011771号