这是几天前蓝桥杯的一道往年竞赛题
前些天参加蓝桥杯赛前培训的时候老师用Java语言敲过
今天重新用C语言敲了一遍
这是一道数字拆解的问题
题目是让编写程序来得到一个数共有几种不同的拆解方法
例如 3 可以拆分成1+1+1;1+2;
例如 4 可以拆分成 2 + 2 ;2 + 1 + 1 ; 1 + 1 + 1 + 1
我们接下来编写一个程序来验证一个数有几种拆法!
#include<stdio.h>
#include<stdlib.h>
#define NUM 10
#define DEBUG 0
int main(void)
{
int table[NUM][NUM / 2 + 1]; //建立一个动态规划表格
int count = 0;
int result = 0;
int i, j, k;
printf("数字拆解\n");
printf("以此类推,求 %d 有几种拆法 ? ", NUM);
for (i = 0; i < NUM; i++) //使用循环进行初始化
{
table[i][0] = 1;
table[i][1] = 1;
}
for (i = 2; i <= NUM; i++) //套用循环
{
for (j = 2; j <= i; j++)
{
if (i + j > NUM)
{
continue;
}
count = 0;
for (k = 1; k <= j; k++)
{
count += table[i - k][(i - k >= k) ? k : i - k];
}
table[i][j] = count;
}
}
for (k = 1; k <= NUM; k++) //计算并显示结果
{
result += table[NUM - k][(NUM - k >= k) ? k : NUM - k];
}
printf("\n\nresult: %d\n", result);
if (DEBUG)
{
printf("\n除错资讯\n");
for (i = 0; i < NUM; i++)
{
for (j = 0; j < NUM / 2 + 1; j++)
{
printf("%2d", table[i][j]);
}
printf("\n");
}
}
system("pause");
return 0;
}