数的拆分(求更高效算法)
u 问题描述:
将正整数n拆分成k份(使k个数之和的等于n),且每种拆分方案不能为空,任意两种拆分方案不能相同(不考虑顺序)。例如:n=7,k=3,共4种拆分方法为:①1、1、5; ②1、2、4; ③1、3、3; ④2、2、3。下面三种分法被认为是相同的:1、1、5; 1、5、1; 5、1、1;
u 编程任务:
给定的正整数n,分成k分,编程计算有多少种不同的分法。
u 数据输入:
输入数据只有一行2个数:n、k (6<n≤200, 2≤k≤6)。
u 结果输出:
输出数据是一个,有多少种不同的分法。
u 输入输出样例:
输入: 7 3
输出: 4
-------------------------------------
以下是我对该问题的解决代码。 算法就是硬搜,时间复杂度大概为 n^k 。100 6 还可以接受 200 6就无法忍受了,要1分来钟。
#include "stdio.h"
#include "stdlib.h"
int count;
void Select(int step,int cur,int n,int k,int sum)
{
int i;
if(sum>n) return;
if(step>k)
{
if(n==sum)
count++;
return;
}
for(i=cur;i<=n;i++)
{
Select(step+1,i,n,k,sum+i);
}
}
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
count=0;
Select(1,1,n,k,0);
printf("%d\n",count);
}
return 0;
}