洛谷 P1025 [NOIP2001 提高组] 数的划分 (dfs)

https://www.luogu.com.cn/problem/P1025

给定一个n和k,把n拆分成k个数字的和,数字可以相同,但是种类不能相同。

求能凑出的数量。
输入7 3
输出4

明明是一道很简单的dfs,不知道为什么就是没有写好,还是看了别人的题解才过,我太菜了

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL N=500200,M=2002;
LL n,k,ans=0;
//前一个是啥,总数是啥,已经摆放好了的位置是多少?
void dfs(LL last,LL sum,LL num)
{
    if(num==k)//刚好凑到k份
    {
        if(sum==n) ans++;//看一看有没有达标
        return ;
    }
    for(LL i=last;sum+i*(k-num)<=n;i++)//当前位置是last,后面还有k-num个位置,要确保非递减,所以这样可以有效剪枝
        dfs(i,sum+i,num+1);
}
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    //cin>>T;
    while(T--)
    {
        cin>>n>>k;//将整数n分成k份
        dfs(1,0,0);
        //从1开始划分在第一份
        //已经凑到的总数
        //凑到了几个位置?
        cout<<ans<<endl;
    }
    return 0;
}
posted @ 2022-09-22 20:23  Vijurria  阅读(27)  评论(0编辑  收藏  举报