• P1025 数的划分


    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
    ", ans);
    	return 0;
    	}
    
  • 相关阅读:
    hdu 4302 Holedox Eating 夜
    poj 1947 Rebuilding Roads 夜
    hdu 4303 Hourai Jeweled 夜
    poj 1286 Necklace of Beads 夜
    poj 2057 The Lost House 夜
    hdu 4301 Divide Chocolate 夜
    poj 3140 Contestants Division 夜
    BOM(二)
    Str的方法
    求出字符窜的字母的个数
  • 原文地址:https://www.cnblogs.com/Tony-Double-Sky/p/9321623.html
Copyright © 2020-2023  润新知