WooKinson

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
问题描述
  将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
  例如:n=7,k=3,下面三种分法被认为是相同的。
  115; 151; 511;
  问有多少种不同的分法。
输入格式
  n,k
输出格式
  一个整数,即不同的分法
样例输入
7 3
样例输出
4 {四种分法为:115;124;133;223;}
数据规模和约定
  6<n<=2002<=k<=6

 

记:

动态题目自己写的依旧没能得到满分,学习他人的解题思路

(代码参考:https://blog.csdn.net/liuchuo/article/details/51989133https://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 }

 

posted on 2018-04-09 23:47  WooKinson  阅读(255)  评论(0编辑  收藏  举报