算法训练 数的划分
题目:
问题描述 将整数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