ycllzl1314
級(jí)別: 探索解密
精華主題: 0
發(fā)帖數(shù)量: 66 個(gè)
工控威望: 196 點(diǎn)
下載積分: 901 分
在線時(shí)間: 328(小時(shí))
注冊(cè)時(shí)間: 2013-12-10
最后登錄: 2024-12-28
查看ycllzl1314的 主題 / 回貼
樓主  發(fā)表于: 2015-08-01 23:24
遇到點(diǎn)問(wèn)題,請(qǐng)師傅們幫忙看看。

有D1  D2  D3 `````D10    一共10個(gè)寄存器數(shù)據(jù),有常數(shù)K,

10個(gè)寄存器數(shù)據(jù)順序排放,每次N個(gè)相加,要求(D1+D2+DN )最大并且小于 K,求N

如果用PLC寫(xiě)上面的程序,該怎么寫(xiě),一點(diǎn)思路都沒(méi)有,PLC用松下的
lvpretend
級(jí)別: 論壇先鋒
精華主題: 0
發(fā)帖數(shù)量: 1264 個(gè)
工控威望: 1434 點(diǎn)
下載積分: 3697 分
在線時(shí)間: 324(小時(shí))
注冊(cè)時(shí)間: 2015-07-20
最后登錄: 2024-11-29
查看lvpretend的 主題 / 回貼
1樓  發(fā)表于: 2015-08-02 14:58
沒(méi)看懂:
10個(gè)寄存器數(shù)據(jù)順序排放,每次N個(gè)相加,要求(D1+D2+DN )最大并且小于 K,求N。
既然每次有N個(gè)數(shù)相加,為什么有要求(D1+D2+DN)三個(gè)數(shù)了。
你是不是說(shuō)的N個(gè)數(shù)相加,小于K,最大的組合,要求全部組合還是一個(gè)就行(因?yàn)榭赡艹霈F(xiàn)多個(gè)結(jié)果相同)?
這是個(gè)排列組合呀!計(jì)算量有點(diǎn)大。
首先,10個(gè)數(shù)N1,N2,N3,N4,N5,N6,N7,N8,N9,N10。
再定義10個(gè)緩沖區(qū)A1,,,,,,,,A10,10個(gè)緩沖區(qū)相加,A1+A2+,,,,,,,+A10
N1,,,,,N10可以對(duì)應(yīng)分別移入A1,,,,A10,具體移動(dòng)幾個(gè)數(shù),看情況。不移入的,填寫(xiě)0.
如何確定哪些要移入呢?
設(shè)一個(gè)可以位操作的16位數(shù)D(其實(shí)只需使用低10位),對(duì)這個(gè)數(shù)每次加1,直到10位完成,2^10=1024,也就是要做1024次。
每次計(jì)算結(jié)果判斷大于K,丟棄。小于K,結(jié)果存放到一個(gè)中間暫存變量中(定義MAX),且把這個(gè)D也存入一個(gè)數(shù)據(jù)隊(duì)列中。
D由1開(kāi)始計(jì)算,1的16位二進(jìn)制編碼為0000 0000 0000 0001
先把A1,,,A10清0
那么按位尋址D-M1位1,則把N1移入A1,其它為0則不移動(dòng)
A1,,,,A10累加,結(jié)果與K比較,大于K,不管,小于K,存入。

下一個(gè)循環(huán),
A1,,,A10清零
D+1=2,二進(jìn)制編碼為0000 0000 0000 0010
把N2,移入A2,再累加,,,,,

現(xiàn)在你懂了吧,也就是把1024種組合全部計(jì)算完,就可以找出全部符合你要求的數(shù)。
當(dāng)然這個(gè)算法不夠簡(jiǎn)練,是最笨的方法,但編程會(huì)方便些。其它算法會(huì)復(fù)雜些,計(jì)算速度也要快些,但編程不方便。

這個(gè)用時(shí)間中斷來(lái)寫(xiě),比如1mS中斷一次,這樣在1S多點(diǎn)就能求出結(jié)果。