CodeVS1039 数的划分 插图题解!

题目

题目描述

将整数n分成k份,且每份不能为空,任意两种划分方案不能相同(不考虑顺序)。 
例如:n=7,k=3,下面三种划分方案被认为是相同的。 
1 1 5 
1 5 1 
5 1 1 
问有多少种不同的分法。

输入描述

输入:n,k (6

输出描述

输出:一个整数,即不同的分法。

样例输入

7 3

样例输出

4

题解!

我们用dp[i][j]表示把数字i分成j份的方案数,那么: 
1. i < j 时,不存在方案,dp[i][j]=0; 
2. i >= j 时,考虑: 
    1) 当前方案存在“1”这个数时,可以“裁去”这个1,从而实现 j 的减少。 
 
    2) 当前方案不存在“1”这个数时,j减少不了,但是仍可以“裁去”最底下的“一层”,即所有数减去1,总数i减去j,实现 i 的减少。 

所以:

dp[i][j]=dp[i-1][j-1]+dp[i-j][j];(j<=i)

代码:

 1 #include <cstdio>
 2 using namespace std;
 3 int N, K, dp[205][8];
 4 int main(){
 5 scanf("%d%d", &N, &K);
 6 dp[0][0] = 1;
 7 for(int i = 0; i <= N; i++)
 8 for(int j = 1; j <= K && j <= i; j++)
 9 dp[i][j] = dp[i-1][j-1] + dp[i-j][j];
10 printf("%d\n", dp[N][K]);
11 return 0;
12 }
时间: 2025-01-20 00:26:29

CodeVS1039 数的划分 插图题解!的相关文章

[codevs1039]数的划分

这一题实际上是组合数学里面的经典问题,跟第二类Stirling数有些相似.可以把一个数值为n的数看成n个小球,划分的份数k看作是k个盒子,那么本题的要求就是: 将n个小球放到k个盒子中,小球之间与盒子之间没有区别,并且最后的结果不允许空盒 与第二类Stirling数的递推公式的推导过程相似: 将n个小球放到k个盒子中的情况总数 = 1. 至少有一个盒子只有一个小球的情况数 + 2. 没有一个盒子只有一个小球的情况数 这样进行划分的原因是这种分类足够特殊,1和2都有可以写出来的表达式: 1. 因为

luoguP1025+codevs 1039 数的划分 x

luoguP1025 + codevs1039 数的划分 2001年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 将整数n分成k份,且每份不能为空,任意两种划分方案不能相同(不考虑顺序).例如:n=7,k=3,下面三种划分方案被认为是相同的.1 1 5 1 5 1 5 1 1问有多少种不同的分法. 输入描述 Input Description 输入:n,k (6<n<=200,2<=k<=

codevs——1039 数的划分

1039 数的划分 2001年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 将整数n分成k份,且每份不能为空,任意两种划分方案不能相同(不考虑顺序).例如:n=7,k=3,下面三种划分方案被认为是相同的.1 1 5 1 5 1 5 1 1问有多少种不同的分法. 输入描述 Input Description 输入:n,k (6<n<=200,2<=k<=6) 输出描述 Output D

1440:【例题1】数的划分

1440:[例题1]数的划分 类型 DFS  可行性剪枝  上下界剪枝 题解 为了防止TLE,那就不能简单暴搜 1.由于分解数字不考虑顺序,我们不如设定分解的数字依次递增,所以扩展节点时的下界>=前一个结点的值,也就是a[ i ] >= a[ i-1 ] 2.那么上界呢?假设已经分解出了k份,那么 i + 1 份不超过 n' /(m-k+1) 因为你已经分解了k份,还有m-k+1份待分解,但是这 m-k+1份的和为 n' ,因为始终保证分解出的序列非递减,那么,第k份最大就是平均数 代码 #i

NOIP2001 数的划分

题二 数的划分(20分) 问题描述 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法. 输入:n,k (6<n<=200,2<=k<=6) 输出:一个整数,即不同的分法. 样例 输入: 7 3 输出:4 {四种分法为:1,1,5;1,2,4;1,3,3;2,2,3;} [思路] 递推. 递推式d[i][j]=d[i-1][j-1]+d[i-j][j]

C语言 &#183; 数的划分

算法提高 数的划分 时间限制:1.0s   内存限制:256.0MB 问题描述 一个正整数可以划分为多个正整数的和,比如n=3时: 3:1+2:1+1+1: 共有三种划分方法. 给出一个正整数,问有多少种划分方法. 输入格式 一个正整数n 输出格式 一个正整数,表示划分方案数 样例输入 3 样例输出 3 数据规模和约定 n<=100 作者注释:递归问题.(本题运行超时) step表示当前剩余的数需要分成的份数;把n分成k份,只需第一个数等于i,计算从i等于1一直到i等于n/k,然后把剩余的n-i

codevs 1039 数的划分 x

1039 数的划分 2001年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 将整数n分成k份,且每份不能为空,任意两种划分方案不能相同(不考虑顺序).例如:n=7,k=3,下面三种划分方案被认为是相同的.1 1 5 1 5 1 5 1 1问有多少种不同的分法. 输入描述 Input Description 输入:n,k (6<n<=200,2<=k<=6) 输出描述 Output Desc

数的划分(动规)

数的划分 总时间限制:  1000ms 内存限制:  65536kB 描述 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5: 1,5,1: 5,1,1: 问有多少种不同的分法. 输出:一个整数,即不同的分法. 输入 两个整数n,k (6 < n <= 200,2 <= k <= 6),中间用单个空格隔开. 输出 一个整数,即不同的分法. 样例输入 7 3 样例输出 4 提示 四种分法为:1,1,5:

8787:数的划分(又是一个放苹果)

8787:数的划分 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5: 1,5,1: 5,1,1: 问有多少种不同的分法. 输出:一个整数,即不同的分法. 输入 两个整数n,k (6 < n <= 200,2 <= k <= 6),中间用单个空格隔开. 输出 一个整数,即不同的分法. 样例输入 7 3 样例输出 4