【枚举暴搜】【NOIP2001】数的划分

来源:互联网 发布:python in用法 编辑:程序博客网 时间:2024/06/01 09:36

 

第二题:数的划分

(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;}

 

 

原创粉丝点击