蓝桥杯

来源:互联网 发布:linux sleep usleep 编辑:程序博客网 时间:2024/05/21 16:18
算法训练 数的划分

题目:

问题描述
  将整数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

分析:
这题关于数字的选择计算用暴力肯定拿不到满分,额自己暴力也60分,下面有大神的代码(100分)。

代码在此:(100分)
#include<stdio.h>int dfs (int n, int k) {if(n == k || k==1) return 1;else if(n < k) return 0;else return dfs(n-k, k)+dfs(n-1, k-1);} int main () {int n, k;scanf("%d%d", &n, &k);//n = 200;//k = 5;printf("%d",dfs(n,k));return 0;}

暴力代码:(60分)
#include<stdio.h>#define SIZE 6int n, k;int dfs (int send,int for_n,int tran) {//send记录已经获取数字  for_n目前的总数  tran上一个数的值(避免往前循环) int i;int temp;int s = 0;if(send > k){if(for_n == n)return 1;return 0;}for(i = tran; i < n; i ++){//temp = for_n+i;if(temp > n)continue;s += dfs(send+1,temp,i);}return s;}int main () {int i;scanf("%d%d", &n, &k);printf("%d",dfs(1,0,1));return 0;}



0 0
原创粉丝点击