码迷,mamicode.com
首页 > 其他好文 > 详细

P1025 数的划分

时间:2018-07-17 10:30:46      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:合成   格式   inline   cpp   str   大于   整数   print   turn   

P1025 数的划分

题目描述
将整数 nn 分成 kk 份,且每份不能为空,任意两个方案不相同(不考虑顺序)。

例如: n=7n=7 , k=3k=3 ,下面三种分法被认为是相同的。

1,1,51,1,5 ;
1,5,11,5,1 ;
5,1,15,1,1 .

问有多少种不同的分法。

输入输出格式
输入格式:
n,k ( 6<n \le 2006<n≤200 , 2 \le k \le 62≤k≤6 )

输出格式:
1个整数,即不同的分法。


很久没写 \(dfs\) 了, 回来复习一下

\(dfs\) + 剪枝解决即可, 剪枝不用多说, 大于合成值直接不下一层即可, 注意枚举的新的分值是单调递增的, 一个不符合就直接 \(break\) 即可

还有一点比较巧妙的是 \(dfs\) 顺序, 本题中要求合成数不重复, 我们利用 枚举的数单调递增 来解决容斥的问题就好: 在每一层 \(dfs\) 里记录上一层选的大小, 枚举时从那个值开始, 便能保证递增

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
int RD(){
    int flag = 1, out = 0;char c = getchar();
    while(c < '0' || c > '9'){if(c == '-')flag = -1;c = getchar();}
    while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
    return flag * out;
    }
int num, k;
LL ans;
void dfs(int left, int now, int last){
    if(left == 0){
        if(now == num)ans++;
        return ;
        }
    for(int i = last;i <= num;i++){
        if(now + i > num)break;
        dfs(left - 1, now + i, i);
        }
    }
int main(){
    num = RD(), k = RD();
    dfs(k, 0, 1);
    printf("%lld\n", ans);
    return 0;
    }

P1025 数的划分

标签:合成   格式   inline   cpp   str   大于   整数   print   turn   

原文地址:https://www.cnblogs.com/Tony-Double-Sky/p/9321623.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!