最少配对数算法,男女配对算法
1+2+3+4...+100=? 怎么算出来的
把数字都分成两部分1+99 2+98 3+97 .。。。。。49+51(共49个)以此类推就剩下一个50,再加100,所以就是5050
天干地支配对排列组合算法
首先我们先要明白天干与地支是如何搭配的
天干:甲、乙、丙、丁、戊、己、庚、辛、壬、癸
地支:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥。十天干与十二地支按顺序两两相配,从甲子到癸亥,共六十个组合,即六十甲子。(10与12的最小公倍数是60)
1 2 3 4 5 6 7 8 9 10 11 12
甲子 乙丑 丙寅 丁卯 戊辰 己巳 庚午 辛未 壬申 癸酉 甲戌 乙亥
13 14 15 16 17 18 19 20 21 22 23 24
丙子 丁丑 戊寅 己卯 庚辰 辛巳 壬午 癸未 甲申 乙酉 丙戌 丁亥
25 26 27 28 29 30 31 32 33 34 35 36
戊子 己丑 庚寅 辛卯 壬辰 癸巳 甲午 己未 丙申 丁酉 戊戌 己亥
37 38 39 40 41 42 43 44 45 46 47 48
庚子 辛丑 壬寅 癸卯 甲辰 乙巳 丙午 丁未 戊申 己酉 庚戌 辛亥
49 50 51 52 53 54 55 56 57 58 59 60
壬子 癸丑 甲寅 乙卯 丙辰 丁巳 戊午 己未 庚申 辛酉 壬戌 癸亥
序号 1 2 3 4 5 6 7 8 9 10
天干 甲 乙 丙 丁 戊 己 庚 申 壬 癸
序号 1 2 3 4 5 6 7 8 9 10 11 12
地支 子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥
1894年是甲午年,那么1895年的天干是乙,依此类推,1900年的天干就是庚;同样,1894年的地支是午,1900年的地支就是子;所以1900年是庚子年。如果大家还想到1901年八国联军胁迫清签订了《辛丑条约》,就是1901年是辛丑年,那么天干与地支的序号都往前推一下,也可以推出来1900年是庚子年。(《辛丑条约》中的所涉及的赔款,因为是针对1900年(庚子年)的义和团运动而规定,所以也叫庚子赔款。)
如果没有告诉你相邻的某个年份是什么年,那么又怎样推算呢?比如,1861年用干支纪年应是?1984年用干支纪年应是?
这里有一个计算的公式:N=X-3-60m(0≦N﹤60,m是一个自然数)
N是60个干支的序号,比如N=1时就是甲子,X就是公元某某年。
那么按照这个公式,1861年的序号就是:1860-3-60m,那么就取m=29,这样N=58,如果取m=30的话,N=-2,这时就要加60,也就是说0≦N﹤60,如果N=0,那么就是第60个干支。现在知道与1861年对应干支是第58个,但是如果没有上面那个表格可供查阅,怎么办呢?我们知道天干是10个,地支是12个,10天干与12地支按顺序两两相配,那么第58号对应的天干的序号应是58÷10的余数,余数是8,第八个天干是申;同样,第58号对应的地支的序号是58÷12的余数,余数是10,第十个地支是酉,所以1861年是农历辛酉年。
所以天干的序号A=mod(N,10),地支的序号B= mod(N,12)
(大家就是对于m应该取多少,不用去想,很简单,就像小学生列除法算式一样,N-3那个数除以60,所得的商数就是m, 余数就是N)
注意:这里的公式只适用于公元后的年份
公元前的计算公式应是N=X-2-60m,(因为公元前1年后就是公元元年也就是公元1年,没有公元0年),(X就是一个负数了,m也取负数)
不过不知道这个公式是否准确。前面的公式N=X-3-60m来源于《简明天文学教程》 作 者: 余明 ;出版社: 科学出版社。
配对问题 数学
第一次一个螺丝配两个螺母 第二次一个螺丝配三个螺母 所以 第二次每个螺丝比第一次多了一个螺母。懂了吧
"最少配对数"
交易所按“最少配对数”原则将卖方交割的各仓库仓单分配给对应的配对买方。
就是说,买卖双方的实物交割尽量安排在最少的客户之间进行。
比如,一个卖方有100吨货,尽量安排与一个买100吨货的客户交割,而不要按排与10个买10吨货的客户交割。
运动员最佳配对问题
#include
using namespace std;
int n, a[22][22], b[22][22], vis[22], pre[22], ans;
void dfs(int x, int s)
{
if(x>n)
{
ans = max(ans, s);
return;
}
if(s+pre[n]-pre[x-1]
{
return;
}
for(int i = 1; i<=n; i++)
{
if(!vis[i])
{
vis[i] = 1;
dfs(x+1, s+a[x][i]*b[i][x]);
vis[i] = 0;
}
}
}
int main()
{
cin>>n;
for(int i = 1; i<=n; i++)
{
for(int j = 1; j<=n; j++)
{
cin>>a[i][j];
}
}
for(int i = 1; i<=n; i++)
{
for(int j = 1; j<=n; j++)
{
cin>>b[i][j];
}
}
for(int i = 1; i<=n; i++)
{
for(int j = 1; j<=n; j++)
{
pre[i] = max(pre[i], a[i][j] * b[j][i]);
}
pre[i] += pre[i - 1];
}
dfs(1, 0);
cout<< ans <
}
求会km算法,且会使用matlab算出最优匹配的大神帮忙,最好懂编程的
KM算法:其实感觉它的最基本得思想就是逐渐接近最优匹配,每次向最有匹配迈出最小的一步,直到达到最优为止(到最后,sigma(lx[i]+ly[i])刚好等于最优匹配值)
算法开始,初始化LX[I]为等点I的最大的边的权值,LY[I]初始为0,在这个时候如果各个定点所对应得最大权值得边终点刚刚没有重合的话,显然,目前的匹配状况既是最优的。
算法进行的过程中不断的更新顶标(LX[I],LY[I])的值来进行匹配。
每次寻找增广路径,找到的话继续寻找下一个点,找不到的话更改目前的顶标值,由于(sigma(lx[i]+ly[i]))是最优匹配的估计值,如果找不到当前节点的匹配的话,说明目前的最优匹配的估计值不能实现,需要调整,而KM算法的核心就是如何实现一个有效同时又正确的调整的方法。
以最小的调整逐渐靠近答案是必须的,其次就是需要知道要调整哪些顶标,首先,调整不能破坏目前的匹配状况(因为匹配是在寻找增广路径中实现的)