pascal郵票問題程式設計題目郵票問題

2021-03-05 22:25:17 字數 3705 閱讀 7244

1樓:天使街⒈號

如樓上所說這個子程式其實就是求能構成的最大面值,對於每個面值的郵票,選擇要幾張,並且郵票用光了就結束,結果就在money裡

其實沒有太大的意義 讓你體會一下回溯的思想

2樓:匿名使用者

這個子程式其實就是求能構成的最大面值,對於每個面值的郵票,選擇要幾張,並且郵票用光了就結束,結果就在money裡,通過money就可以得知某個價值能否構成。。。。大概就是這個意思,如果還不明白就把整個程式貼出來。。。。

3樓:匿名使用者

此題可以看作是0 1揹包背最小价值,把每個郵票的面額看成w[i],把數字j所需使用的w的個數看成價值(或者效益),把1~allv(allv=n*maxw)所需的w個數都列舉出來,然後在結合本題,本題也就是求解連續的f[j]<=n的最大值,狀態轉移方程:f[j]:=min(f[j],f[j-w[i]]+1);理解時可以把w看成是無數個,用f來限制就ok了!

也就是說求出每個數字所需要的w的個數的最優情況都求解出來!最後線性去掃描f,找出連續的一段f<=n的最大值!

詳見下面的程式**:

program stamp;

const maxn=110;maxv=25510;

var m,n,ans,allv:longint;

w:array[0..maxn] of longint;

opt:array[0..maxv] of longint;

procedure init;

var i,maxw:longint;

begin

assign(input,'stamp.in');reset(input);

assign(output,'stamp.out');rewrite(output);

readln(m,n);

maxw:=0;

for i:=1 to m do

begin

read(w[i]);

if w[i] > maxw then maxw:=w[i];

end;

allv:=n*maxw;

end;

function min(x,y:longint):longint;

begin

if x < y then exit(x) else exit(y);

end;

procedure main;

var i,j:longint;

begin

filldword(opt,sizeof(opt) div 4,maxint);

opt[0]:=0;

for i:=1 to m do

for j:=w[i] to allv do //可以把物品理解為有無數件,用opt去限制

if (j-w[i] >= 0)and(opt[j-w[i]] < n) then opt[j]:=min(opt[j],opt[j-w[i]]+1);

ans:=1;i:=1;

while i <= allv do

begin

while (opt[i] > n)and(i < allv) do inc(i);

j:=i+1;

while (opt[j] <= n)and(j <= allv) do inc(j);

if j-i > ans then ans:=j-i;

i:=j;

end;

end;

procedure print;

begin

writeln(ans);

close(input);close(output);

end;

begin

init;

main;

print;

end.

回溯 連續郵資問題 詳細解析 pascal

4樓:匿名使用者

你好,解釋一下做法

bool c[255*100] // c[j] 記錄 面值

綜合為j的方案存不存在

count[j] 是面值為j的郵票當前剩餘多少枚

核心處理方法:

procedure try (count[255]:integer;sum:integer;use:integer)//sum是當前的總和 use是用了的枚數

begin

if use>n then exit; //如果用的超出了限制數目 退出子程式 不再進行下去

c[sum]=true; //當前的組合總值是可以被組合的 , 所以把這格填寫true

for i:=1 to 255 do //窮舉所有面值

if count[i]>0 // 有可用的郵票

begin //進行嘗試

count[i]:=count[i]-1; // 因為使用了所以暫時-1

try(count[255],sum+i) //進行遞迴 , 總和加上了這次選擇的面值 i

count[i]:=count[i]+1; //還原面值可用數量

end;

end;

主程式一開始要做的是:

begin

read(m,n);

for i:=1 to m do

begin

read(tmp);count[tmp]:=n; //初始化

end;

try(count[255],0,n);//嘗試組合可能性

for i:=1 to 25500 //所有可能的組合 temp是目前連續的數目 if (c[i]=false) temp:=0

else begin

temp:=temp+1;

if temp>ans ans:=temp; //和答案比較 求最大值

end;

writeln(ans);

end.

不明白可以追問 :) 希望能採納 打了半天xd

程式設計題目:郵票問題

5樓:張_銀

分析問題後可列出數學算式:0.2x+xy/7+303=x ,x為郵票總數,化簡後的2121=x(5.6-y),得出y的取值範圍:1<=y<6,x,y為正整數。

#include

void main()}}

6樓:匿名使用者

是七分之幾啊

用數學邏輯搞明白了 c++還不就是"翻譯"一下就行了

郵票郵資問題

7樓:匿名使用者

國內外埠(港澳臺除外)平信重量20克以內只需1.2元郵資。任意一家郵局(郵政儲蓄銀行)都會有郵票岀售,當然也可以寄信,貼上郵票投進郵筒就ok了。

8樓:匿名使用者

國內普通平信(20克以內),本

埠(也是本市地區範圍內)貼80分郵票。外埠(港澳臺除外)無論是黑龍江到廣東,還是上海到烏魯木齊,都是1.20分(1元2角郵票)郵資。

安徽合肥寄信到武漢武昌屬於郵寄外埠,平信20克內需要貼1.2元郵票。如果**,另加**郵資3元。

**信需要到郵局櫃檯辦理。寄信都要去郵政局,郵政局就有售郵票的,以普通郵票為主。郵政儲蓄銀行是銀行方面業務,不辦理郵寄信件事項

9樓:匿名使用者

不超重的情況下,全國都是一塊二郵政儲蓄不賣郵票,需要到郵政局去買郵票和寄信,街上的郵筒也可以,但是比較慢

pascal程式設計題目

vara array 1.100 of integer n,i,ans,len,tmp,beg integer begin read n for i 1 to n do read a i tmp 0 ans 0 len 0 beg 0 for i 1 to n do begin if tmp a i...

Pascal程式設計問題

那位仁兄的答案是錯的額,你判斷閏年有問題,真正閏年的定義是 年號是400的整倍數或4的整倍數 但非100的倍數 也就是說2000是閏年,2004年也是閏年,但3000年不是閏年。vara,b,c integer begin readln a,b casebof 1,3,5,7,8,10,12 c 3...

跨省寄信需要面值多少的郵票?順便問一下郵票平日怎麼收集

除了本縣或本城區之外的地區,都是20克以內1.20元。收集郵票,如果是信銷票的話,親戚朋友處打個招呼,請他們給你留著,因為現在信函用的比較少,所以信銷票還是很不容易收集。到郵市去看看,看中自己喜歡的就買下。還有就是網上相關的 看看,這個是比較方便的。信件分本埠和外埠,本埠是市區內的信件,信件出市區就...