统计n-k特殊集的数目
2014-07-27 22:14
113 查看
【题目】如果正整数构成的集合X满足以下条件,我们称它为n-k特殊集:
1、集合X中的每个元素x均不超过n,即1<=x<=n.
2、集合X中所有的元素之和大于k.
3、集合X中不包含任意一对相邻的自然数.
给出n,k,求n-k特殊集合有多少个。1<=n<=100 ,0<=k<=400.
样例输入:6 3
样例输出:17
样例输入:14 55
样例输出:1
样例输入:40 1000
样例输出:367185615
【分析】设n-k特殊集的个数为f(n,k),我们要想办法来建立它的递推式。由于几何中的元素不能重复,元素n要么要集合中恰好出现一次,要么不出现,二者不重复、不遗漏地把n-k特殊集分成两部分:
1、n不出现。则f(n,k) = f(n-1,k).
2、n出现一次。则f(n,k) = f(n-2,k-n).
所以递推表达式为:f(n,k) = f(n-1,k) + f(n-2,k-n).
边界条件是什么呢?(这儿我也有点不懂)
当n<=0,k>=0时,f(0,k) = 0.
当n<=0,k<0时,f(0,k) = 1.
由上式可看出:k<0是,f(n,k)与k无关,用 -1 来代表所有的负数,这样可得到下式:
f(n,k) = 0(n = 0,-1,k>=0)
f(n,-1) = 1(n = 0,-1)
为了符合平时的书写习惯 ,我们用宏来处理负数的数组下标。
代码如下:
1、集合X中的每个元素x均不超过n,即1<=x<=n.
2、集合X中所有的元素之和大于k.
3、集合X中不包含任意一对相邻的自然数.
给出n,k,求n-k特殊集合有多少个。1<=n<=100 ,0<=k<=400.
样例输入:6 3
样例输出:17
样例输入:14 55
样例输出:1
样例输入:40 1000
样例输出:367185615
【分析】设n-k特殊集的个数为f(n,k),我们要想办法来建立它的递推式。由于几何中的元素不能重复,元素n要么要集合中恰好出现一次,要么不出现,二者不重复、不遗漏地把n-k特殊集分成两部分:
1、n不出现。则f(n,k) = f(n-1,k).
2、n出现一次。则f(n,k) = f(n-2,k-n).
所以递推表达式为:f(n,k) = f(n-1,k) + f(n-2,k-n).
边界条件是什么呢?(这儿我也有点不懂)
当n<=0,k>=0时,f(0,k) = 0.
当n<=0,k<0时,f(0,k) = 1.
由上式可看出:k<0是,f(n,k)与k无关,用 -1 来代表所有的负数,这样可得到下式:
f(n,k) = 0(n = 0,-1,k>=0)
f(n,-1) = 1(n = 0,-1)
为了符合平时的书写习惯 ,我们用宏来处理负数的数组下标。
代码如下:
#include <iostream> #include <cstdio> using namespace std; #define F(i,j) (f[(i)+1][(j)+1]) //宏处理 long long f[200][500]; int main() { int i,j,k,n; while(cin>>n>>k){ for(j = -1; j <= k; j++) F(-1,j) = F(0,j) = 0; F(-1,-1) = F(0,-1) = 1; for(i = 1; i <= n; i++) for(j = -1; j <=k; j++){ F(i,j) = F(i-1,j); if(j-i < 0) F(i,j) += F(i-2,-1); else F(i ,j) += F(i-2,j-i); } cout<<F(n,k)<<endl; } return 0; }
相关文章推荐
- java统计英文字母、空格、数字和其它字符的数目
- 正则匹配大小写字母、汉字、特殊字符,并统计次数
- Java统计字符串中中文,英文,特殊字符出现的次数
- 使用dex-method-counts.jar统计APK中方法数目
- Java 文件统计:编写程序,统计英文文本文件中的字符数目和单词数目。程序运行时,输入要统计的文件的名称,程序处理后输出字符数目和单词数目
- 统计文件数目(不包括隐藏文件/文件夹)
- String(字符串)数目统计
- 经典:统计字符串中汉字,英文,数字,特殊符号个数
- 设计相应的数据结构和算法,尽量高效的统计一片英文文章(总单词数目)里出现的所有英文单词, * 按照在文章中首次出现的顺序打印输出该单词和它的出现次数。
- python 实现统计ftp服务器指定目录下文件夹数目、文件数目及所有文件大小 本次主要为满足应用方核对上传到ftp服务器的文件是否缺漏。 主要要求:指定目录下,文件夹数目/文件数目/所有文件大小
- 统计文件下包含的文件夹和文件的数目
- linux统计文件夹中文件数目
- shell_wc(统计数目)、head(查看前几行)、tail(查看末尾几行)
- python (9)统计文件夹下的所有文件夹数目,和统计文件夹下所有文件数目
- 用C++统计字符串中的数字、字符和特殊字符的个数
- Linux笔记(shell特殊符号,sort排序,wc统计,uniq去重,tee,tr,split)
- 统计两个文件中相同行的数目
- 统计数据库中业务表的数目和记录总数
- 使用sql统计7天之内每天的数目
- 第十三周项目5 统计数组中各个字母的数目