首页 > 代码库 > Laoj P1272 取数
Laoj P1272 取数
问题背景
|
动态规划入门-第21题
|
试题描述
|
从1,2,。。。,n中任取k个数,要求所取的k个数中,任意两个数不能相差1。编程求有多少种取法。
如:n=6 ,k=3,,从1,2,3,4,5,6中取3个数,任意两个数不能相差1,取法如下: (1 3 5) (1 3 6) (1 4 6) (2 4 6) 共有4种取法。 提示:(1 3 5)和(3 1 5)属于一种取法。 |
输入格式
|
一行,n和k,中间用空格隔开
(1<=k<=n<=100) |
输出格式
|
一行,取法的种数。
|
输入示例
|
6 3
|
输出示例
|
4
|
【分析】
因为任意两数不能相邻,所以dp[i][j]=dp[i-1][1]+...+dp[i-1][j-2]。
注意这里要用long long,否则可能会爆。
还有当n<2k-1时,不存在这样的取数方案。
【代码】
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 long long n, k, ans, dp[105][105]; 5 6 int main() { 7 cin >> n >> k; 8 if (k==1) 9 cout << n << endl; 10 for (int i=2;i<=k;++i) 11 for (int j=i*2-1;j<=n;++j) 12 if (i==2) 13 dp[i][j]=j-2; 14 else 15 for (int t=1;t<=j-2;++t) 16 dp[i][j]+=dp[i-1][t]; 17 for (int i=1;i<=n;++i) 18 ans+=dp[k][i]; 19 cout << ans << endl; 20 }
Laoj P1272 取数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。