我必须编写一个C程序(用于我的离散数学分配),它找到从集合A (|A| = m)
到集合B (|B|=n)
的函数数量,并显示所有这些函数。我使用代码计算的函数数量:
for(k=0; k<n; k++)
x = x + pow( -1, k) * combination( n, n - k ) * pow( ( n - k ), m);
组合是一个找到可能组合数的函数。
例如,如果A = {1,2,3},B = {a,b,c},则根据公式计算的函数数量为 3 ^ 3 - 3(2 ^ 3)+ 3 = 6。 一种可能的解决方案是f = {(1,a),(2,b),(3,c)} [我知道这是一个解决方案]。
但我的问题是:如何显示每一个解决方案!? 这只是一个微不足道的例子。但是如果m和n值增加(假设m> = n)那么可能的函数数量呈指数增长! 例如,如果m = 7且n = 4,则有8400个函数!
我想不出任何方法来显示A和B之间存在的每一个函数。
答案 0 :(得分:4)
我前一段时间回答过类似的问题,但是m和n相等m = n
。(你必须递归思考才能解决这个问题),你的评论我觉得可能的答案是:{(1,a)(2,b)(3,c)}, {(2,a)(3,b)(1,c)}, {(3,a)(1,b)(2,c)}, {(3,a)(2,b)(1,c)}, {(2,a)(1,b)(3,c)} and {(1,a)(3,b)(2,c)}
那么这是我的食谱:
设置2个数组及其初始值,让我们称之为letters
和numbers
。
*---*---*---* *---*---*---*
| a | b | c | <---letters. | 1 | 2 | 3 | <---numbers.
*---*---*---* *---*---*---*
选择其中一个阵列作为您的支点,我选择letters
,它将是静态的。
*---*---*---* *---*---*---*
| a | b | c | <---STATIC. | 1 | 2 | 3 | <---DYNAMIC.
*---*---*---* *---*---*---*
根据需要逆时针或顺时针旋转动态阵列,必须使用i element of numbers
打印i element of letters
。
*---*---*---* *---*---*---* *---*---*---*
| 1 | 2 | 3 | -(Print)-> | 2 | 3 | 1 | -(Print)-> | 3 | 1 | 2 |
*---*---*---* *---*---*---* *---*---*---*
所以你明白了这一点:{(1,a)(2,b)(3,c)}, {(2,a)(3,b)(1,c)}, {(3,a)(1,b)(2,c)}
,3缺失。
将i element
与动态数组的n element
交换。
*---*---*---* *---*---*---*
| 1 | 2 | 3 | ---------( Swap (0<->2) )-------> | 3 | 2 | 1 |
*---*---*---* *---*---*---*
重复步骤3.
*---*---*---* *---*---*---* *---*---*---*
| 3 | 2 | 1 | -(Print)-> | 2 | 1 | 3 | -(Print)-> | 1 | 3 | 2 |
*---*---*---* *---*---*---* *---*---*---*
所以你得到了错过的子集:{(3,a)(2,b)(1,c)}, {(2,a)(1,b)(3,c)} and {(1,a)(3,b)(2,c)}
。
如果您有超过3个示例4.简单:1234
(旋转N次,其中N是变量的数量,并在每次移动时打印),交换1和4 - &gt; 4231
(轮换和打印),交换2和3 - &gt; 4321
(轮换和打印),交换4和1 - &gt; 1324
(轮播和打印)。
我希望这会有所帮助。