【枚举暴搜】【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;
}

 

 

posted @ 2012-08-20 20:27  jiangzh  阅读(342)  评论(0编辑  收藏  举报