数的划分(第一篇解题报告)

来源:互联网 发布:奇葩室友 知乎 编辑:程序博客网 时间:2024/06/02 14:45
 算法训练 数的划分  
时间限制:1.0s   内存限制:256.0MB
      
问题描述
  将整数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
# include <stdio.h>int n,k;int count=0;void f(int num, int cnt, int sum){    if (num == k-1)    {        if (n-sum >= cnt)            count++;        return ;    }    int i;    for (i=cnt; i<n; i++)    {        if (n-(sum+i) < i)            return ;        f(num+1, i, sum+i);    }}int main(){    scanf("%d %d", &n, &k);    f(0, 1, 0);        printf("%d", count);        return 0;}
这本是一道动态规划题目,只是限于本人水平不到位,只得用深搜做了出来,话说这算是DFS吧??我对DFS概念的很是模糊。。。由于没有用DP法,所以数据大了效率就明显不高了,下面是网上搜的DP算法:
#include "stdio.h"int main(){      int n,k,g[7][201],i,j;      while(scanf("%d%d",&n,&k)!=EOF)      {          memset(g,0,sizeof(g));          for(j=0;j<=n;j++)              g[1][j]=1;          for(i=2;i<=k;i++)          for(j=0;j<=n-k;j++)          {              if(j>=i)                  g[i][j]=g[i-1][j]+g[i][j-i];              else                  g[i][j]=g[i-1][j];          }          printf("%d\n",g[k][n-k]);      }      return 0;}

做解题报告的目的:一是希望与大家交流交流,闭门造车真是不好的。二是对自己的历程有个见证,也对自己花费了的时间和自己有个交代。。。
与君共勉
0 0
原创粉丝点击