




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
設(shè)有大小不等的X,Y,Z三個(gè)無(wú)刻度的油桶,分別能夠盛滿(mǎn)油X,Y,Z(例如,X=8,Y=5,Z=3),并約定X>Y>Z。
初始時(shí),僅X油桶盛滿(mǎn)油,Y和Z油桶為空。要求程序?qū)ふ乙环N最少的分油步聚,在某個(gè)油桶中分出T升油(例如T=4)。
解:
令三個(gè)油桶的盛油情況為倒油過(guò)程的狀態(tài),則倒油過(guò)程就是狀態(tài)變化的過(guò)程。為了記錄倒油過(guò)程,程序引入倒油狀態(tài)隊(duì)列,
將倒油過(guò)程中產(chǎn)生的狀態(tài)存儲(chǔ)在隊(duì)列中。隊(duì)列的每個(gè)元素記錄每次分油后各個(gè)油桶的分油后各個(gè)油桶的盛油量和倒油軌跡等有關(guān)信息。
程序反復(fù)從隊(duì)列中取出第一個(gè)還未檢查過(guò)的狀態(tài),對(duì)該狀態(tài)下的每個(gè)油桶判斷其是否可以倒出油,及是否可以倒進(jìn)油。由于油桶沒(méi)有刻度,
分油時(shí)只能將某個(gè)油桶倒?jié)M或倒空。程序分別按倒空或倒?jié)M兩種可能的倒油動(dòng)作執(zhí)行不同的處理,產(chǎn)生新的倒油狀態(tài),
為避免某個(gè)倒油狀態(tài)在隊(duì)列中重復(fù)出現(xiàn),程序只將未曾出現(xiàn)過(guò)的新?tīng)顟B(tài)及其倒油軌跡信息存入隊(duì)列中,假定程序檢查了相當(dāng)多的狀態(tài)后,
或能找到解,或能確定問(wèn)題無(wú)解。倒油程序算法如下:
算法---無(wú)刻度油桶分油
{
輸入各桶容量和目標(biāo)容量;
將初始狀態(tài)存入倒油狀態(tài)隊(duì)列;
設(shè)置其它初始值;
do
{
對(duì)狀態(tài)隊(duì)列中第一個(gè)還未檢查的元素
在還未檢查完每個(gè)倒出的桶且還未找到解且還未確定無(wú)解情況下循環(huán)
if(倒出桶有油)
在還未檢查完每個(gè)桶且還未找到解且還未確定無(wú)解情況下循環(huán)
if(當(dāng)前桶不是倒出桶且桶還有空)
{
確定本次倒油量;
在隊(duì)列中檢查倒油后的結(jié)果狀態(tài)是否在隊(duì)列中出現(xiàn);
if(結(jié)果狀態(tài)不在隊(duì)列中出現(xiàn))
{
將結(jié)果狀態(tài)和軌跡信息存入隊(duì)列;
if(有桶中的油達(dá)到目標(biāo)容量)
設(shè)置找到解標(biāo)志;
}
}
if(還未找到解)
{
修正隊(duì)列第一個(gè)還未檢查過(guò)的元素指針;
if(隊(duì)列中的元素都已檢查過(guò))
設(shè)置無(wú)解標(biāo)志;
}
}while(還未找到解且還未確定無(wú)解);
if(找到解)
{
根據(jù)倒油步聚的軌跡信息,形成倒油步聚序列;
輸出倒油步聚序列;
}
}
倒油隊(duì)列中的元素應(yīng)包含下列信息:各桶的盛油量,該狀態(tài)是從哪一個(gè)桶(源桶)倒向哪一個(gè)桶(目標(biāo)桶)而形成的,
形成該狀態(tài)的元素在隊(duì)列中的位置。根據(jù)以上算法編寫(xiě)如下程序。程序代碼如下:
#include<stdio.h>
#defineN100
#defineBUCKETS3
structele{
intstate[BUCKETS];/*各桶盛油量*/
intsbucket;/*源桶*/
intobucket;/*目標(biāo)桶*/
intlast;/*軌跡元素在隊(duì)列中的下標(biāo)*/
}q[N];/*隊(duì)列*/
intfull[BUCKETS];
inti,j,k,found,unable,wi,wj,v,targ;
inthead,tail;
voidmain()
{
/*輸入各桶容量和目標(biāo)容量*/
printf("Entervolumeofbuckets.");
for(i=0;i<BUCKETS;i++)
scanf("%d",&full[i]);
/*如要檢查full[0]>full[1]>full[2],相應(yīng)代碼在此*/
printf("Entervolumeoftarg.");
scanf("%d",&targ);/*檢查targ<=full[0]的代碼在此*/
/*設(shè)置將初始狀態(tài)存入倒油狀態(tài)隊(duì)列等初值*/
q[0].state[0]=full[0];
for(i=1;i<BUCKETS;i++)
q[0].state[i]=0;
q[0].sbucket=0;
q[0].obucket=0;
q[0].last=0;
found=unable=0;
head=tail=0;
do
{
/*對(duì)狀態(tài)隊(duì)列中第一個(gè)還未檢查過(guò)的元素在還未檢查完每個(gè)倒出的桶
且還未找到解且還未確定無(wú)解情況下循環(huán)*/
for(i=0;i<BUCKETS&&!found&&!unable;i++)
if(q[head].state[i]>0)/*倒出桶有油*/
/*在還未檢查完每個(gè)油桶且還未找到解且還未確定無(wú)解情況下循環(huán)*/
for(j=0;j<BUCKETS&&!found&&!unable;j++)
if(j!=i&&q[head].state[j]<full[j])
{/*當(dāng)前桶不是倒出桶且桶還有空*/
/*確定本次倒油量*/
if(q[head].state[i]>full[j]-q[head].state[j])
v=full[j]-q[head].state[j];
elsev=q[head].state[i];
wi=q[head].state[i]-v;
wj=q[head].state[j]+v;
/*在隊(duì)列中檢查倒油后的結(jié)果狀態(tài)是否在隊(duì)列中出現(xiàn)*/
for(k=0;k<=tail;k++)
if(q[k].state[i]==wi&&q[k].state[j]==wj)break;
if(k>tail)/*結(jié)果狀態(tài)不在隊(duì)列中出現(xiàn)*/
{
/*將結(jié)果狀態(tài)和軌跡信息存入隊(duì)列*/
tail++;
q[tail].state[i]=wi;
q[tail].state[j]=wj;
q[tail].state[3-i-j]=q[head].state[3-i-j];
q[tail].sbucket=i+1;
q[tail].obucket=j+1;
q[tail].last=head;
/*如有桶達(dá)到目標(biāo)盛油量,則設(shè)置找到解標(biāo)志*/
if(wi==targ||wj==targ)found=1;
}
}
if(!found)/*還未找到解*/
{
head++;/*修正隊(duì)列第一個(gè)還未檢查過(guò)元素指針*/
if(head>tail)/*隊(duì)列中的元素都已檢查過(guò)*/
unable=1;/*設(shè)置無(wú)解標(biāo)志*/
}
}while(!found&&!unable);/*還未找到解且還未確定無(wú)解*/
if(found)/*找到解*/
{
/*根據(jù)倒油步聚的軌跡信息,形成倒油步聚序列*/
i=tail;
j=-1;
do/*原倒油步聚逆向鏈接,現(xiàn)改為正向鏈接*/
{
k=q[i].last;
q[i].last=j;
j=i;
i=k;
}while(j);
/*輸出倒油步聚序列*/
for(k=q[k].last;k>=0;k=q[k].last)
{
printf("%5dto%2d:",q[k].sbucket,q[k].obucket);
for(i=0;i<BUCKETS;i++)
printf("%4d",q[k].state[i]);
printf("");
}
}
elseprintf("Unable!");
}
分油
我們首先用字母a,b,c代表8斤桶,5斤桶和3斤捅。規(guī)定倒油的順序?yàn)椋?/p>
a->b->c->a
并且必須符合如下規(guī)則:
1.b(5斤桶)倒空后才能從a(8斤桶)中取油。
2.c(3斤桶)盛滿(mǎn)后才能向a(8斤捅)中倒油。
我們?cè)O(shè)從a中往b倒油x次,從c往a倒油y次,那么最后a中剩下的油應(yīng)該為8-
5x+3y斤,按照題意,我們得到如下方程,
8-5x+3y=4:
我們?yōu)榱说玫竭@個(gè)方程的解,應(yīng)按照上述的倒油規(guī)則不斷的倒下去,直到a中或b中
油的重量為4斤為止,另外也可以改變倒油的規(guī)則,看能否找到最好的倒油步聚。代碼:#include<stdio.h>
inti;
main()
{
inta,y,z;
printf("InputFulla,Emptyb,c,Geti:");
/*讀入3個(gè)容器的容量和最后需要的數(shù)量*/
scanf("%d%d%d",&a,&y,&z,&i);
getti(a,y,z);
}
getti(inta,inty,intz)
{
intb=0,c=0;
/*b,c為二個(gè)容器的實(shí)際重量*/
printf("a%db%dc%d%4d%4d%4d",a,y,z,a,b,c);
while(a!=i||b!=i)
/*如果滿(mǎn)足要求退出循環(huán)*/
{
if(!b)
/*如果b為空,從a往b倒油*/
{
a-=y;b=y;
}
elseif(c==z)
{
a+=z;c=0
/*如果c已滿(mǎn),從c往a倒油*/
}
elseif(b>z-c)
{
b-=(z-c);c=z;
/*如果b的重量大于c的剩余重量,倒?jié)Mc*/
}
else
{
c+=b;b=0;
/*否則將b中的油全部倒入c*/
}
printf("%4d%4d%4d",a,b,c);
}
}運(yùn)行結(jié)果:
InputFulla,Emptyb,c,
Geti:8534volume:a=8
b=5
c=3
start:8
0
0
3
5
0
3
2
3
6
2
0
6
0
2
1
5
2
1
4
3
4
4
0 前些天有人問(wèn)我如何實(shí)現(xiàn)精密的分壓,他認(rèn)為電阻分壓不夠精密.其實(shí)分壓的目的就是為了符合AD轉(zhuǎn)換的輸入范圍,但其實(shí)有時(shí)候不但輸入范圍超出AD量程,甚至?xí)且粋€(gè)負(fù)電壓,這個(gè)時(shí)候需要將電壓平移.反正今天雙休有空,我就說(shuō)說(shuō)自己的做法,疏漏之處敬請(qǐng)諒解現(xiàn)今大多數(shù)的AD芯片都采用單電源+5V、+3.3V甚至更低的+1.8V供電,其差模輸入范圍一般是±Vref(差分輸入)、0~+Vref,部分允許使用外部基準(zhǔn)的芯片允許0~VDD的輸入范圍,但是無(wú)論如何無(wú)法對(duì)一個(gè)負(fù)的輸入電壓進(jìn)行AtoD的轉(zhuǎn)換(也許有一些雙電源的AD芯片可以,但我是個(gè)新手沒(méi)仔細(xì)研究過(guò))。如果要對(duì)一個(gè)過(guò)零的正負(fù)信號(hào)進(jìn)行AD轉(zhuǎn)換就必須進(jìn)行電平的平移。理論上如圖1所示的差分放大器就可以完成電平平移的效果,差分放大器的增益等于1,因此Vout=Vin+5.000。Vin=-5~+5V,因此經(jīng)過(guò)平移后Vout=0~10V,再經(jīng)過(guò)電阻R18、R19二分壓到符合AD系統(tǒng)輸入范圍的電壓。 但是圖1所示的電路并不理想。第一,放大電路的輸入阻抗約等于R16+R17=20K,低的輸入阻抗要求信號(hào)源必須是低內(nèi)阻具有衡壓輸出特性的信號(hào)源,否則將造成很大的誤差;第二,R8R9R16R17的匹配程度將直接影響增益精度;第三,R18R19的二分壓也將帶來(lái)2%的最大誤差,如果并非二分壓那么R18≠R19,由于消耗的功率不一樣導(dǎo)致R18溫度與R19不相等,溫漂將使得分壓誤差加大;第四,任何接入的電路將等效成一個(gè)負(fù)載,即使AD系統(tǒng)只吸收很低的電流,等效阻抗很大,也將進(jìn)一步加大分壓的誤差。 對(duì)于第一個(gè)問(wèn)題,可以在差分放大前加入一級(jí)電壓跟隨器作為緩沖,利用運(yùn)放的高輸入阻抗減少對(duì)信號(hào)源的影響,并且運(yùn)放的低輸出阻抗衡壓輸出的特性可以很好的滿(mǎn)足差分放大級(jí)的“特殊”要求。對(duì)于第二和第三個(gè)問(wèn)題,使用0.1%低溫漂的精密電阻器可以大為改善。對(duì)于第四個(gè)問(wèn)題,再運(yùn)放負(fù)載能力允許的情況下使用阻值更小的電阻器可以將影響降低,但是應(yīng)當(dāng)注意的是-----使用阻值更小的電阻器將會(huì)使消耗功率增加,而消耗功率的增加又使得溫度上升,溫漂問(wèn)題加重。經(jīng)過(guò)改進(jìn)的電路如圖2所示: 當(dāng)然,你還可以使用單片集成差分放大器去替換后端的用精密運(yùn)放和精密電阻器構(gòu)建的差分放大電路,例如單位增益的AMP03。其高共模抑制比(CMRR):100dB(典型值)、低非線(xiàn)性度:0.001%(最大值)、低失真:0.001%(典型值)、總增益誤差0.0080%的性能是絕對(duì)優(yōu)勝于分立器件構(gòu)建的差分放大電路的。然而成本是否增加很多我就不知道了,我不是采購(gòu)不知道價(jià)格,哈哈。圖1圖2 但是圖2所示電路在處理一些幅度更大的信號(hào)會(huì)出現(xiàn)“瓶頸”。一般運(yùn)放的擺幅在電源軌以?xún)?nèi)應(yīng)留有2V的余量。以圖2為例,電平平移以后輸出0~10V,對(duì)于圖2中±12V供電來(lái)說(shuō)剛好可以滿(mǎn)足,但是如果輸入信號(hào)幅度更大±7.5V呢?那么即使運(yùn)放工作在±15V的推薦最大工作電壓下也無(wú)法滿(mǎn)足,為了輸出不失真的信號(hào)運(yùn)放就只能工作在±18V的極限電源電壓下了。那如果先電阻分壓再跟隨再作電平平移呢?不就可以很好解決么?我們看看下面的圖三:圖3圖3中電路只需改變R1R2的比例就可以很容易使輸出符合AD系統(tǒng)的輸入范圍,并且由于先分壓再作電平平移,因此輸出的最大值就是AD系統(tǒng)允許的輸入最大值,上述圖2電路的“瓶頸”問(wèn)題不再存在。為了盡量減少對(duì)信號(hào)源的影響,R1R2的值必須足夠大,但是對(duì)于電壓跟隨器U2來(lái)說(shuō)R1R2的分壓網(wǎng)絡(luò)相當(dāng)于一個(gè)內(nèi)阻等于R1//R2的信號(hào)源,因此U2的輸入阻抗必須足夠大。對(duì)于圖3,即使U2等效阻抗高達(dá)100M,也將帶來(lái)1%的誤差,因此R1R2數(shù)量級(jí)的選擇應(yīng)該綜合考慮信號(hào)源內(nèi)阻和電壓跟隨器的輸入阻抗。 如果要求更精密的的分壓和電平平移是否有更好的辦法呢?我們都知道一個(gè)高開(kāi)環(huán)增益,低失調(diào)電壓的運(yùn)放只要將輸出完全反饋到反相端就可以構(gòu)成電壓跟隨器;那如果將輸出完全反饋到單位增益的儀表放大器反相輸入端呢?-----那就是一個(gè)精密的二分壓電路!!因?yàn)閇(Vin+)–(Vin-)]*G=Vout,而此時(shí)Vin-=Vout、G=1因此Vin+=2Vout,即Vout=1/2(Vin+)。并且由于失調(diào)誤差也同時(shí)負(fù)反饋到反相端相減,因此儀表放大器的失調(diào)誤差為原來(lái)的1/2。 對(duì)于±5平移到0~10V并且需要分壓到0~5V的應(yīng)用,圖4的電路剛好能滿(mǎn)足。他在電平平移的同時(shí)實(shí)現(xiàn)了精密的二分壓。與圖2、圖3相比除了具有更高的精度之外,還具有更高的輸入阻抗因此對(duì)信號(hào)源影響更??;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 河南省安陽(yáng)市殷都區(qū)2024-2025學(xué)年九年級(jí)上學(xué)期1月期末化學(xué)試題(含答案)
- 2019-2025年消防設(shè)施操作員之消防設(shè)備高級(jí)技能自我檢測(cè)試卷A卷附答案
- 2025年消防設(shè)施操作員之消防設(shè)備高級(jí)技能能力檢測(cè)試卷B卷附答案
- 2023-2024學(xué)年廣東省廣州大學(xué)附中七年級(jí)(下)期中數(shù)學(xué)試卷(含答案)
- 新疆題型專(zhuān)練+2024新疆中考
- 部門(mén)承包合同(2篇)
- 2025年反洗錢(qián)知識(shí)競(jìng)賽多選題庫(kù)及答案(共70題)
- 產(chǎn)品手冊(cè)與功能使用指南匯編
- 三農(nóng)行業(yè)實(shí)戰(zhàn)指南之土地流轉(zhuǎn)操作流程
- 中國(guó)四大名著經(jīng)典情節(jié)解讀
- MSDS中文版(鋰電池電解液)
- (正式版)YBT 6328-2024 冶金工業(yè)建構(gòu)筑物安全運(yùn)維技術(shù)規(guī)范
- 2024年中國(guó)煤科煤炭科學(xué)技術(shù)研究院有限公司招聘筆試參考題庫(kù)含答案解析
- 線(xiàn)切割操作規(guī)程培訓(xùn)
- 光伏安裝培訓(xùn)課件模板
- 有機(jī)化學(xué)(馮駿材編)課后習(xí)題答案
- 新法律援助基礎(chǔ)知識(shí)講座
- 圖文解讀中小學(xué)教育懲戒規(guī)則(試行)全文內(nèi)容課件模板
- 起重機(jī)械安全技術(shù)規(guī)程(TSG-51-2023)宣貫解讀課件
- 《建筑攝影5構(gòu)》課件
- 2024虛擬電廠管理規(guī)范
評(píng)論
0/150
提交評(píng)論