首页 > 代码库 > 离散数学笔记,基础数学分支
离散数学笔记,基础数学分支
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)
但是这里可以相等。
离散数学笔记,基础数学分支