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