pascal郵票問題

2021-03-24 05:14:48 字數 5630 閱讀 8140

1樓:匿名使用者

你最後一步的prin寫錯了!

應該這樣寫:

var n,m,i,mm:integer;

a:array[1..100]of integer;

money:array[0..10000]of boolean;

procedure print;

var max,i,j:integer;

begin

max:=0; (區域性變數必須初始化,不然的話就亂了)i:=0;

j:=0;

repeat

inc(i);

j:=0;

while money[j+i] do (這裡必須用while,因為money[i]不一定是true)

inc(j);

(原來的j=j+1不需要,浪費,刪掉了。)if j>max then

max:=j;

i:=j+i;

until i>=mm;

writeln(max);

end;

procedure search(k,n,x:integer);

var i:integer;

begin

if (n<=0) or (k<=0) thenexit;

for i:=n downto 0 do

begin

x:=x+a[k]*i;

if x>mm then

mm:=x;

n:=n-i;

money[x]:=true;

search(k-1,n,x);

n:=n+i;

x:=x-a[k]*i;

end;

end;

begin

mm:=0;

readln(n,m);

for i:=1 to m do

read(a[i]);

search(m,n,0);

print;

end.

2樓:匿名使用者

m是指小型張、小全張,這裡特61m就是牡丹小型張。

c是老紀念郵票,從2023年到2023年這段時間發行的紀念郵票。

s是老特種郵票,從2023年到2023年這段時間發行的特種郵票。

2023年到2023年這段時間發行的文革郵票;

2023年到2023年這段時間發行的編號郵票;

j是新紀念郵票,從2023年到2023年這段時間發行的紀念郵票。

t是新特種郵票,從2023年到2023年這段時間發行的特種郵票。

2023年後發行的紀念、特種郵票一般稱之為編年郵票。

r是指普通郵票。

sc是指加字改值郵票。

d是指欠資郵票。

a是指航空郵票。

mil是指軍用郵票。

sb是指小本票。

jp是指紀念郵資明信片。

tp是指特種郵資明信片。

mc是指極限片。

jf是指紀念郵資封。

wj是指外交封。……

3樓:匿名使用者

你最後一步的print掛掉了!

應該這樣改:

var n,m,i,mm:integer;

a:array[1..100]of integer;

money:array[0..10000]of boolean;

procedure print;

var max,i,j:integer;

begin

max:=0; //區域性變數必須初始化

i:=0;

j:=0;

repeat

inc(i);

j:=0;

while money[j+i] do //這裡必須用while,因為money[i]不一定是true

inc(j);

//原來的j=j+1不需要,刪掉了。

if j>max then

max:=j;

i:=j+i;

until i>=mm;

writeln(max);

end;

procedure search(k,n,x:integer);

var i:integer;

begin

if (n<=0) or (k<=0) thenexit;

for i:=n downto 0 do

begin

x:=x+a[k]*i;

if x>mm then

mm:=x;

n:=n-i;

money[x]:=true;

search(k-1,n,x);

n:=n+i;

x:=x-a[k]*i;

end;

end;

begin

mm:=0;

readln(n,m);

for i:=1 to m do

read(a[i]);

search(m,n,0);

print;

end.

4樓:匿名使用者

我已經放下競賽了,現在看到題就...

5樓:science_電

灑家水平太低,只是個初學者,我想匿名提問者可能不是一般人。

pascal郵票問題

6樓:天使街⒈號

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

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

7樓:匿名使用者

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

8樓:匿名使用者

此題可以看作是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

9樓:匿名使用者

你好,解釋一下做法

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

Pascal問題 矩陣乘法,Pascal 矩陣乘法的完整過程?

vara,b,c,i,j,k longint x,y,f array 0.2000,0.2000 of longint begin read a read b read c for i 1 to a do for j 1 to b do read x i,j for i 1 to b do for ...

pascal問題望解答,3個pascal問題,望解答!

第一題就是while3重,判斷。然後判斷它是不是素數 pascal程式設計問題,求大師解答!這個問題一點也不簡單!這涉及演算法 簡單的思路,就是對這n個數,做列舉,從1個,2個,3個,每個裡面又有不同的組合,這就是所謂的 冪集 如果n很大的時候,這個方法效率太低不可行 前面那位同學提及的揹包演算法就...

pascal的迴圈問題

for i 1 to n 限定的數的分母 do接下來說思路吧。總之分母是i,分子就是i 1,除一除就行了。然後把每次除得的商累加到一個變數中去。能明白吧?varn,i longint ans double begin read n ans 1 for i 2 to n do ans ans i 1 ...