首页 > 代码库 > 离散数学笔记,基础数学分支

离散数学笔记,基础数学分支

1、给定n个数字,要求选出3个数,其和为3的倍数。

思路,分类,把每个数字%3后,0、1、2、的分成三类,然后按类计算。

①、三个数来自同一个类,②、来自0、1、2各一类。

 

2、将r个相同的球放到n个不同的盒子里面,盒子的球数不限,求方案数。

将r个球用0表示,就是000000....000,然后分成n份,所以需要插上n - 1刀,所以就是r + n - 1长度的01串中,其中1的个数是n - 1个,求有多少种。就是C(n + r - 1, n - 1)。比如分成两份,如果是100的话,就是第一份个数是0,第二份个数是2.

这题也可以这样想,用xi 表示第i个盒子中的球数,其中xi >= 0。所以就是x1 + x2 + x3 + .... + xn = r的解的个数。思路和上面一样。

 

3、求解x1 + x2 + x3 + x4 = 10的个数,其中xi >= ai

每个数都有权值了,但是明显可以把每个数都减去自身的权值,又回到xi >= 0的解法。

 

4、求解x1 + x2 + x3 + x4 <= 10。其中xi >= ai

由于是小于等于,那么可以去掉权重后,加多一个辅助变量x5

变成x1 + x2 + x3 + x4 + x5 = 10的解的方案数。为什么呢?

比如1 + 1 + 1 + 1 = 4 < 10是成立的,然后剩下的就相当于给x5了,x5 = 6,然后就是相加等于10的方案数。

 

变形一下:在一排有20本书的书架上,选出6本书,要求这6本书不能相邻,求方案数。

设xi表示第i本书与上一本书的间隔书的数目,为了满足条件。x1 >= 1, 其他xi >= 2。

那么就是要x1 + x2 + x3 + x4 + x5 + x6 <= 20

 

5、count how many hello world

for (int i = 1; i <= n; ++i) 

  for (int j = 1; j <= i; ++j) 

    for (int k = 1; k <= j; ++k)

      cout << "hello world" << endl;

输出运行了多少次hello world

考虑大小关系,n >= i >= j >= k >= 1

①、如果i和j和k不能相等,那么就是在1、2、3、4、5、6、7....n里,选3个数出来就好了C(n, 3)

但是这里可以相等。

 

离散数学笔记,基础数学分支