您的位置:首页 > 其它

2014校选题(二)-- 母函数问题

2014-04-23 13:46 148 查看
题目二

问题描述

排列组合问题中,分割是个有趣的问题。分割的意思,是把一個数字切成很多小部分之后,要保持总和不变。例如a+b+c=5, 而a,b,c都要是整数。则可能的情況是1+1+3,或是1+3+1或是1+2+2…等有很多个。現在为了简化问题,我们只想知道输入一个数字N,请问只用1,2,3三个数字字来切,則共有几种不同的组合方式?请输出全部的组合。

例如N=5,则输出 5=1+1+1+1+1=1+1+1+2=1+1+3=1+2+2=2+3 ,共有5种可能。

若N=6,则输出6=1+1+1+1+1+1=1+1+1+1+2=1+1+1+3=1+1+2+2=1+2+3=2+2+2=3+3共有7种可能。

【输入】

每行一个样本,在那一行中,只有一个数字N,保证在1到15之间。

输出

每个样本,有很多行输出。每行代表一种可能,请输出全部可能的组合情形。输出来的顺序可以与范例不同。但总数要相同。另外,每个样本之间用一个空白行隔开。

【样例输入】

6

样例输出

1+1+1+1+1+1

1+1+1+1+2

1+1+1+3

1+1+2+2

1+2+3

2+2+2

3+3

//这道题考察母函数,将母函数模板看会后再做此题 so easy~~

/***********************
*
*	title: 母函数问题
*
*	time: 2014.4.23
*
***********************/

#include <stdio.h>

void print(int i, int j, int k)
{
int n;

if (i != 0)
{
n = i;

for (i = 1; i < n; i++)
{
printf("1 + ");
}

printf("1");
}

if (j != 0)
{
n = j / 2;

if (i != 0)
{
printf(" + ");
}

for (j = 1; j < n; j++)
{
printf("2 + ");
}

printf("2");
}

if (k != 0)
{
n = k / 3;

if (i || j)
{
printf(" + ");
}

for (k = 1; k < n; k++)
{
printf("3 + ");
}

printf("3");
}

printf("\n");
}

int main()
{
int n;

while (~scanf("%d", &n))
{
int j;
int i;
int k;

for (i = 0 ; i <= n; i++)  //表示(1 + x + x^2 + x^3.....)的系数
{
for (j = 0; j + i <= n; j += 2)  //表示(1 + x^2 + x^4.....)的系数
{
for (k = 0; k+i+j <= n ; k += 3)  //表示(1 + x^3 + x^6.....)  的系数
{
if (!(i==0 && j==0 && k==3 ||              // 防止 输入n=1,2,3 多项式结果包含单项式1,2,3的情况
i==0 && k==0 && j==2 || j==0 && k==0 && i==1))
{
if (k + i + j == n)
{
print(i, j, k);
}
}

}
}
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: