数的划分

就是给你一个数和划分为的几份(都不为空),看看有几种划分方案

刚开始做TLE两个点,我在想好像只要枚举到倒数第二层就可以了,最后一曾可以直接减,这样的剪枝

然后失败了..
看了题解,可以这样做剪枝:加上限制条件

#include<iostream>
using namespace std;
const int N=50;
int res,n,k;
void dfs(int u,int start,int sum)//深度 开始 当前数的总和 
{
    if(u==k&&sum!=n) return;
    if(u!=k&&sum==n) return ;
    if(u==k&&sum==n)
    {
        res++;
        return ;
    }
    for(int i=start;sum+i*(k-u)<=n;i++)//因为不重复就需要递增或者递减,如果递增,那后面的数字必然<=现在的,所以就需要满足这个条件就可以了
        dfs(u+1,i,sum+i);
}
int main(){
    cin>>n>>k;
    dfs(0,1,0);
    cout<<res;
    return 0;
}
#include<iostream>
using namespace std;
const int N=50;
int res,n,k;
void dfs(int u,int start,int sum)//深度 开始 当前数的总和 
{
    if(u==k&&sum!=n) return;
    if(u!=k&&sum==n) return ;
    if(u==k&&sum==n)
    {
        res++;
        return ;
    }
    for(int i=start;i<n;i++)//直接是数字 
    {
        if(sum+i<=n)
            dfs(u+1,i,sum+i);
        else return ;
    }
}
int main(){
    cin>>n>>k;
    dfs(0,1,0);
    cout<<res;
    return 0;
}

**************有空更新dp类解法

posted @ 2022-05-09 23:30  小志61314  阅读(86)  评论(0)    收藏  举报