一本通——数的划分

题目链接

数的划分icon-default.png?t=N3I4https://loj.ac/p/10018这个题应该是一个dfs深搜的剪枝优化问题,但是似乎用dp也能做,因此写了两个版本的题解

深搜版本

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N];
int n,k;
int ans;
void dfs(int x){
    if(n==0){
        return ;
    }
    if(x==k){
        if(n>=a[x-1]){
            ans++;
        }
        return ;
    }
    for(int i=a[x-1];i<=n/(k-x+1);i++){
        a[x]=i;
        n-=i;
        dfs(x+1);
        n+=i;
    }
}
int main(){
    cin>>n>>k;
    a[0]=1;
    //初始化,一开始只能从1开始
    dfs(1);
    cout<<ans<<endl;
    return 0;

}

dp版本

#include<stdio.h>
int dp[210][10];
int main()
{
    int n,k,i,j;
    scanf("%d %d",&n,&k);
    dp[0][0]=1;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=k;j++)
        {
            if(i>=j)  //j不能大于i
            {
                dp[i][j]=dp[i-1][j-1]+dp[i-j][j];
            }
        }
    }
    printf("%d\n",dp[n][k]);
    return 0;
}

posted @ 2023-05-11 19:38  du463  阅读(6)  评论(0编辑  收藏  举报  来源