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 ...