蓝桥杯 - 算法训练 数的划分 C语言实现

    xiaoxiao2021-03-25  128

    算法训练 数的划分 题目: 问题描述   将整数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 6 int 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; }
    转载请注明原文地址: https://ju.6miu.com/read-11457.html

    最新回复(0)