日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《算法设计编程实验:大学程序设计课程与竞赛训练教材》——2.3 构造法模拟的实验范例...

發布時間:2025/6/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《算法设计编程实验:大学程序设计课程与竞赛训练教材》——2.3 构造法模拟的实验范例... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2.3 構造法模擬的實驗范例

構造法模擬需要完整、精確地構造出反映問題本質的數學模型,根據該模型設計狀態變化的參數,計算模擬結果。由于數學模型建立了客觀事物間準確的運算關系,因此其效率一般比較高。
構造法模擬的關鍵是找到數學模型。問題是,能產生正確結果的數學模型并不是唯一的,從不同的思維角度看問題,可以得出不同的數學模型,而模擬效率和編程復雜度往往因數學模型而異。即便有數學模型,解該模型的準確方法是否有現成算法、編程復雜度如何,這些問題也需要我們仔細考慮。
【2.3.1 Packets】
【問題描述】
一家工廠生產的產品被包裝在一個正方形的包裝盒中,產品具有相同的高度h,大小規格為11、22、33、44、55和66。這些產品是用和產品具有相同高度h,大小規格為6*6的正方形郵包交付給客戶的。由于費用問題,工廠和客戶都要使將訂購的物品從工廠發送給客戶的郵包的數量最小化。請編寫一個程序,對于按照訂單發送給定的產品,找出最少的郵包數量,以節省費用。
輸入:
輸入由若干行組成,每行描述一份訂單,每份訂單由6個整數組成,整數之間用一個空格分開,連續的整數表示從最小的11到最大的66每種大小的包裝盒的數量,輸入以包含6個0的一行結束。
輸出:
對每行輸入,輸出一行,給出郵包的最小數量。對于輸入的最后一行“空輸入”沒有輸出。

試題來源:ACM Central Europe 1996
在線測試地址:POJ 1017,ZOJ 1307,UVA 311
試題解析
這是一道構造法模擬題,其使用的數學模型是一個貪心策略——按照尺寸遞減的順序裝入包裝盒。由于郵包的尺寸為66,因此每個44、55和 66 的包裝盒需要一個單獨的郵包。
6*6:剛好。
55:放入66 的郵包中,剩下的用1*1填充。
44:放入66的郵包后,先用22填充, 沒有22的就用1*1填充。
33:一個66的郵包可以放4個。
22和11一樣操作。
具體實現方法如下。設i*i的包裝盒數為ai(1≤i≤6):
放入66、55、44、33的包裝盒至少需要郵包數M=a6+a5+a4+a34。
M個郵包可填入22的包裝盒數L2=a45+u[a3 mod 4]u[0]=0,u[1]=5,u[2]=3,u[3]=1。若有剩余(a2>L2),則放入新增的a2-L29個郵包,即M+=a2-L29。
最后使用11的L1(=m36-a636-a525-a416-a39-a2*4)個包裝盒填滿M個郵包。若有剩余(a1>L1),則放入新增的a1-L136個郵包,即M+=a1-L136。
顯然,M是放入所有包裝盒的最少郵包數。
程序清單

#include <iostream> using namespace std;int main() {int a[10],i,j,sum,m,left1,left2;// 每種尺寸的包裝盒數為a[];包裝盒總數為sum;使用的郵包數為m;當前 // 郵包可裝入2*2的包裝盒數為left2,可裝入1*1的包裝盒數為left1int u[4]={0,5,3,1};// u[a[3]% 4]while (1){sum=0;for(i=1;i<=6;i++)// 輸入每種尺寸的包裝盒數量,累計包裝盒的總數{cin>>a[i];sum+=a[i];}if(sum==0) break;// 若輸入6個0,則退出程序m=a[6]+a[5]+a[4]+(3+a[3])/4;// 計算放入前4種大尺寸的包裝盒至少需要的郵包數left2=a[4]*5+u[a[3]%4];// 計算M個郵包可填入2*2的包裝盒數if(a[2]>left2)// 若2*2的包裝盒有剩余,則累計新增的郵包m+=(a[2]-left2+8)/9;left1=m*36-a[6]*36-a[5]*25-a[4]*16-a[3]*9-a[2]*4; // 填滿上述郵包需要使用1*1的 // 包裝盒數if(a[1]>left1)// 若1*1的包裝盒有剩余,則累計新增的郵包m+=(a[1]-left1+35)/36;cout<<m<<endl;// 輸出最少郵包數}return 0; }

【2.3.2 Paper Cutting】
【問題描述】
ACM經理需要用名片將他們自己介紹給客戶和合作伙伴。名片上的信息印刷到一大張紙上之后,要用一臺特殊的切割機來切割紙張。由于機器的操作花費非常昂貴,因此要盡量減少切割的次數。請編寫程序,找到切割產生名片的最佳解決方案。
切割有若干條必須遵守的限制。要以恰好a*b張名片的網格結構印刷名片。由于印刷軟件的限制,結構的尺寸(在一行和列中名片的數量)是固定的,不能改變。紙張是矩形的,它的大小是固定的。網格必須垂直于紙張的邊,也就是說,它只可以進行90°的旋轉。但是,可以交換行和列的含義,卡片可以放置在紙張上的任何位置,卡片的邊和紙張邊可以重合。
例如,設定名片的大小是34厘米,網格大小為12張名片。圖2.3-1給出網格的四個可能的方案。要求給出每種情況所需要的最小的紙張尺寸。

用于切割卡片的切割機能夠進行任意長度的連續切割,切割能夠貫穿整片的紙張,不會中途停止。一次切割只能針對一片紙張 —— 不能為了節省切割次數將紙張疊加起來切,也不能把紙張折疊起來切。
輸入:
輸入由若干測試用例組成,每個測試用例由在一行上的6個正整數A、B、C、D、E、F組成,整數間用一個空格分開,這些數的含義如下:
A和B是矩形網格的大小,1 ≤ A,B≤ 1000;C和D是卡片的尺寸,以厘米為單位,1 ≤ C,D ≤ 1000;E和F是紙張的尺寸,以厘米為單位,1 ≤E,F≤ 1000000。
輸入以6個0的一行結束。
輸出:
對每個測試用例,輸出一行,該行給出“The minimum number of cuts is X.”,其中X是要求切割的最小次數。如果紙張不能符合卡片網格,則輸出“The paper is too small.”來代替。

試題來源:CTU Open 2003
在線測試地址:POJ 1791,ZOJ 2160
試題解析
先在紙張中切網格,然后在網格內切名片。設矩形網格大小為ab、名片尺寸為cd、紙張尺寸為ef,即縱向有a張尺寸為c的名片,縱向總長為ac;橫向有b張尺寸為d的名片,橫向總長為bd。而名片的切割在紙張范圍內進行,由此得出約束條件:(ac≤e)&&(b*d≤f)。
切出大小為ab的網格,至少需要ab-1次切割。若acdb-1+(ac1)網格大小為ba(轉90°)、名片尺寸為cd(不變)、紙張尺寸為e*f(不變)。
2)網格大小為ab(不變)、名片尺寸為dc(轉90°)、紙張尺寸為e*f(不變)。
3)網格大小為ba(轉90°)、名片尺寸為dc(轉90°)、紙張尺寸為e*f(不變)。
按照上述方法依次得出三種情況下的切割次數c1、c2、c3,如果其中任意一種情況不滿足約束條件,則切割次數為∞。顯然,最少切割次數為Ans=min{c0,c1,c2,c3}若Ans=∞,則說明紙張不能符合卡片網格,因為所有可能情況都不滿足約束條件。
程序清單

#include <stdio.h> #include <stdlib.h> #include <limits.h> #define TOOBIG INT_MAX int ncuts(int a,int b,int c,int d,int e,int f) ; void do_solve(int a,int b,int c,int d,int e,int f) // 輸入矩形網格大小、卡片尺寸和紙張的尺寸,枚舉 // 旋轉的4種情況,計算最小切割次數 {int x,m ;m=ncuts(a,b,c,d,e,f) ; // 計算未旋轉的切割次數if ((x=ncuts(b,a,c,d,e,f))<m) m=x ;// 網格轉90°,調整最小切割次數if ((x=ncuts(a,b,d,c,e,f))<m) m=x ;// 卡片轉90°,調整最小切割次數if ((x=ncuts(b,a,d,c,e,f))<m) m=x;// 網格和卡片各轉90°,調整最小切割次數if (m==TOOBIG)puts("The paper is too small.");elseprintf("The minimum number of cuts is " "%d.\n",m) ; }int ncuts(int a,int b,int c,int d,int e,int f)// 計算當前情況下(矩形網格大小為(a,b)、卡片尺寸 // 為(c,d)、紙張尺寸為(e,f))的最小切割次數 {if (a*c>e || b*d>f) return TOOBIG ;// 若超出紙張范圍,則返回∞return a*b-1+(a*c<e)+(b*d<f);// 返回切割次數 }int main() { int a,b,c,d,e,f ;for(;;) {a=0 ; b=0 ; c=0 ; d=0 ; e=0 ; f=0 ;scanf("%d %d %d %d %d %d",&a,&b,&c,&d,&e,&f) ;// 輸入矩形網格大小、卡片尺寸和紙張的尺寸if (!a && !b && !c && !d && !e && !f) break ;// 若全為0,則結束程序do_solve(a,b,c,d,e,f) ;}return 0 ; }

總結

以上是生活随笔為你收集整理的《算法设计编程实验:大学程序设计课程与竞赛训练教材》——2.3 构造法模拟的实验范例...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。