DP--划分问题(1)
来源:互联网 发布:sdr软件怎么使用 编辑:程序博客网 时间:2024/06/18 17:46
http://codevs.cn/problem/1039/
将整数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 Description
输出:一个整数,即不同的分法。
样例输入 Sample Input
7 3
样例输出 Sample Output
4
数据范围及提示 Data Size & Hint
{四种分法为:1,1,5;1,2,4;1,3,3;2,2,3;}
分析:
为了避免重复,将分成的k份进行排序得 a1<=a2<=…<=ak, 寻找动态规划方程
由于要保证每份>0,故先给每份分 1,剩下n-k 继续进行分
1. n-k 全部分给第k份 , f(n-k, 1) ;
2. n-k 全部分给第k-1、k份,f(n-k, 2) ;
……
k. n-k 全部分给后面的k份,f (n-k, 2).
所以得到方程f (n,k) =f (n-k,1) +f (n-k,2) +f(n-k,3)+ ……+f(n-k,k)
根据上述方程推导得到 f(n-1,k-1) =f(n-k,1) +f(n-k,2) ……+f(n-k,k-1)
联立上述方程得 f(n,k)=f(n-1,k-1)+f(n-k,k)
当n<k 时 f (n,k)=0;当n==k || k==1时,f(n,k)=1。
<span style="font-size:12px;">#include <iostream>using namespace std;//DPint DP(int n,int k){ if(n<k) return 0; else if(k==1) return 1; int dp[n+1][k+1]={0},i,j; for(i=0;i<=n;i++) for(j=0;j<=k;j++) { if(i<j) dp[i][j]=0; else if(j==1||i==j) dp[i][j]=1; else dp[i][j]=dp[i-1][j-1]+dp[i-j][j]; } return dp[n][k];}//递归DPint f(int n,int k){ if(n<k) return 0; else if(n==k) return 1; else { if(k==1) return 1; else { return f(n-1,k-1)+f(n-k,k); } }}int main(){ int n,k; while(cin>>n>>k) { //cout<<f(n,k)<<endl; cout<<DP(n,k)<<endl; } return 0;}</span>
0 0
- DP--划分问题(1)
- 划分问题(dp)
- nyoj 571 整数划分问题(dp)
- dp-整数划分问题(理论分析)
- dp-整数划分问题(理论分析)
- DP--划分问题(掷骰子)
- 复杂的整数划分问题(dp)
- 题解:整数划分问题(DP)
- 划分数问题 DP
- 整数划分问题 【DP】
- 整数划分问题 DP
- dp-整数划分问题
- 一类DP问题的分析(划分DP)
- 数的划分问题 【DP】
- 划分数(DP)
- 校OJ 8597 石子划分问题(dp)
- 百练:简单的整数划分问题(经典dp)
- 经典问题四. (区间dp) 凸多边形最优三角形划分
- RF+Jenkins构建持续集成
- 使用ShareSdk要注意的问题
- Activity启动模式singleInstance
- keepalived+redis 高可用redis主从解决方案
- 对称的二叉树
- DP--划分问题(1)
- 绿盟扫描报告信息提取
- Mac OS X下Maven的安装与配置
- UIWebView简单使用:加载进度条,加载PDF文件
- MultipleFailureException
- Linux-安装Java SE环境及glassfish
- 解决 an app id with identifier is not available. please enter a different string. xcode 7.3
- multimap 遍历和删除
- 几个比较常用的css