P1025 数的划分(洛谷)DFS或者DP
2017-03-14 15:04
246 查看
题目描述
将整数n分成k份,且每份不能为空,任意两个方案不相同(不考虑顺序)。例如:n=7,k=3,下面三种分法被认为是相同的。
1,1,5; 1,5,1; 5,1,1;
问有多少种不同的分法。
输入输出格式
输入格式:n,k (6<n<=200,2<=k<=6)
输出格式:
一个整数,即不同的分法。
输入输出样例
输入样例#1:7 3
输出样例#1:
4
#include<stdio.h> int n,k; long ans; void dfs(int a,int b,int c) { int i,j; // if(c>n) // return ; if(b==k) ans++; else for(i=a;i<=(n-c)/(k+1-b);i++) dfs(i,b+1,c+i); } int main() { int i,j; scanf("%d%d",&n,&k); dfs(1,1,0); printf("%ld",ans); return 0; }DP:分为有1和没有1的情况,当n<k时dp为0,dp[0][0]=1,有1的时候dp[i][j]=dp[i-1][j-1];没有1时候为dp[i-k][j].
所以dp[i][j]=dp[i-1][j-1]+dp[i-j][j].代码如下:
#include<stdio.h> int n,k; long dp[201][201]; int main() { int i,j; scanf("%d%d",&n,&k); dp[0][0]=1; for(i=1;i<=n;i++) for(j=i+1;j<=n+1;j++) dp[i][j]=0; for(i=1;i<=k;i++) dp[0][i]=0; for(i=1;i<=n;i++) for(j=0;j<=i;j++) dp[i][j]=dp[i-1][j-1]+dp[i-j][j]; printf("%ld",dp [k]); return 0; }
此类DP总结————————>http://www.cnblogs.com/radiumlrb/p/5797168.html(大神的总结看了很受用)
相关文章推荐
- 整数划分 ,DP 或者直接递归(备忘录消除重复)
- NYOJ176 整数划分(二)(DP,DFS)
- 洛谷 1025 数的划分 DP 解题报告
- 洛谷 P1025 数的划分
- 洛谷——P1025 数的划分
- 洛谷 P1025 数的划分
- 洛谷 1118 [USACO] 数字三角形(不是DP的那道) dfs+乱搞
- hdu1224 Free DIY Tour DFS或者dp
- 洛谷 P1025 [NOIP2001 T2] 数的划分
- |洛谷|递推|P1025 数的划分
- 洛谷 P2258 NOIP2014普及组 T4 子矩阵 DFS+DP
- 洛谷 P1025 数的划分
- HDU 1028 Ignatius and the Princess III(母函数 或者 整数划分的DP动态规划)
- 洛谷 P1025 数的划分
- 洛谷 P1025 数的划分
- 【搜索】洛谷 P1025 数的划分
- 【疯狂DP】CCFOJ1185、1186_数的划分一、二 题解——从DFS到DP
- 洛谷P1025 数的划分(题目来源https://www.luogu.org/problem/show?pid=1025)
- NYOJ746 整数划分(四)(深搜DFS,区间DP)
- 【dfs或者dp】等和的分隔子集