问题描述 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。 例如:n=7,k=3,下面三种分法被认为是相同的。 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法。 输入格式 n,k 输出格式 一个整数,即不同的分法 样例输入 7 3 样例输出 4 {四种分法为:1,1,5;1,2,4;1,3,3;2,2,3;} 数据规模和约定 6<n<=200,2<=k<=6
记:
动态题目自己写的依旧没能得到满分,学习他人的解题思路
(代码参考:https://blog.csdn.net/liuchuo/article/details/51989133,https://blog.csdn.net/pason_pc/article/details/51228907)
例如输入n=7,k=3
即得到了关于7的所有划分
两个重点:
1->代码中i的值在prev-n/step之间,从prev开始,确保最小值不会比前一个小,避免出现重复情况;
到n/step结束,是因为当超过n/step时,会出现与前面检索情况重复的现象,
(例dp(3,4,2),由于4=1+3或4=2+2在前面的情况出现过,故会出现重复情况,从而推出适用其他情况)
2->用于确定划分的step,当step=1,即划分完成,可进行计数
AC代码:
1 #include <stdio.h> 2 3 int n,k; 4 int ans = 0; 5 6 void dp(int prev,int n,int step) 7 { 8 int i; 9 if (step == 1)/*划分结束*/ 10 { 11 ans ++; 12 return ; 13 } 14 15 16 for (i = prev ; i <= n/step ; i ++) 17 { 18 dp(i,n-i,step-1); 19 } 20 return ; 21 } 22 23 int main(void) 24 { 25 scanf("%d %d",&n,&k); 26 dp(1,n,k); 27 printf("%d",ans); 28 return 0; 29 }