1樓:
lz確定是揹包的的程式麼。。
我怎麼覺得是在模擬二進位加法。。
按照程式的意思,很容易模擬出b陣列的變化:
直到最高位,也就是第n+1時候為止,這是後,b陣列裡面有n個1,對應的十進位數就是2^(n+1)-1
恩。。我就只能看出這些。。
2樓:網友
fillchar(b,sizeof(b),0);
while b[0]=0 do
begin j:=n;
while b[j]=1 do dec(j);
b[j]:=1;
for i:=j+1 to n do
b[i]:=0;
end; 具體程式的意思最好等全部的程式拿出來我才能跟你解釋~就這麼一小段我也不知道具體的作用,只能就我的理解幫你把每句話解釋一下了~
3樓:樸宜然
lz啊,你這不是用動態規劃解揹包啊,這肯定是列舉。
就是用100010111來表示第i的物品是否取,具體樓下下下下已經解釋得很好了。
不過關於揹包問題,最好用動態規劃,去看看dd牛的揹包九講吧。
4樓:網友
其實這並不是揹包的程式,而是密碼鎖(我自取的),這個密碼鎖是個什麼東西呢?是個好東西,通過這個,可以將遞迴式的搜尋改成非遞迴式的。
真正的揹包一般是這樣的(一維揹包):
fillchar(f,sizeof(f),false);/賦初值。
f[0]:=true;
for i:=1 to n do //列舉物品。
for j:=v downto a[i] do //列舉體積。
if f[j] or f[j-a[i]] then //轉移。
f[j]:=f[j-a[i]];
此類揹包作用極大,是一切動態規劃的基礎,掌握好這個十分重要。若想深入學習、**,詳見《揹包九講》(網上有很多地方可以找到)
pascal的01揹包問題求解。
5樓:武風
if j>w[i] then
if f[i-1,j]>f[i-1,j-w[i]]+p[i] then
f[i,j]:=f[i-1,j]意思是如果放得下 若原來的價值大於新增物品的價值,則價值不變,放棄這個物品。
elsef[i,j]:=f[i-1,j];若放不下則仍是原價值。
完全被包則是東西無限,重量放得下且放著個物品乙個的價值大於另外的選擇則選這個。
揹包問題(pascal)
6樓:網友
辛辛苦苦寫的**,給分啦!
w[i]:重量 v[i]:價值。
01:dp(i,j)=max
有限揹包:把物品可以取的件數拆成1,2,4,8,..2^x,p,然後做01揹包。
無限:dp(i,j)=max**:
var n,m,i,j:longint;
w,v:array[1..1000] of longint;
f:array[0..100000] of longint;
beginreadln(n,m);
for i:=1 to n do read(w[i],v[i]);
for i:=0 to m do f[i]:=0;
for i:=1 to n do
for j:=m downto w[i] doif f[j]=p do
begininc(n2); w[n2]:=p*ww; v[n2]:=p*vv;
tt:=tt-p;
p:=p shl 1;
end;if tt<>0 then
begininc(n2); w[n2]:=tt*ww; v[n2]:=tt*vv;
end;end;
n:=n2;
for i:=0 to m do f[i]:=0;
for i:=1 to n do
for j:=m downto w[i] doif f[j]writeln(f[m]);
end.無限:
var n,m,i,j:longint;
w,v:array[1..1000] of longint;
f:array[0..100000] of longint;
beginreadln(n,m);
for i:=1 to n do read(w[i],v[i]);
for i:=0 to m do f[i]:=0;
for i:=1 to n do
for j:=w[i] to m do
if f[j]writeln(f[m]);
end.
pascal 01揹包問題
7樓:網友
這題我還是覺得用動態規劃比較好,當然也可以直接根據狀態轉移方稱寫個遞迴(不懂自己去看動態規劃)如果用money表示剩下的錢,i表示前i個物品則f(i,money)=max
function f(x,y:longint);
begin這裡是邊界條件。
f<-max
end;
pascal揹包問題
8樓:聽不清啊
for i:=1 to m do
for j:=n downto w[i] do這裡的迴圈順序只能是從後向前。因為其中保留的是上一輪迴圈後留下的資料(即前i-1個物品取或不取已經比較過的,總價為j的最優解已經存放在a[j]中)。
if a[j]如果a[j](第i個物品不取的結果)不如取用第i個物品的結果(其中a[j-w[i]]是留出w[i]用於購買第i個物品j時,剩餘的錢能買到的值),加上買了第i個物品後帶來的收益。
簡言之,不買,不如買的合算,那就買下了!--所以就更新a[j]的值。
pascal 揹包問題
9樓:匿名使用者
就是用動態法畫乙個**,慢慢推出來就好了。
hehe,我們20號比賽呢。
pascal 求寫完全揹包問題的**。
10樓:網友
一)二維表:
完全揹包演算法:
for i:=1 to n do
for j:=1 to m do
if j>w[i] then
if f[i-1,j]>f[i,j-w[i]]+p[i] thenf[i,j]:=f[i-1,j]
elsef[i,j]:=f[i,j-w[i]]+p[i]elsef[i,j]:=f[i-1,j];
writeln(f[n,m]);
順便給你個一維的對照。
二)一維表。
for i:=1 to n do
for j:=w[i] to m do
if f[j]writeln(f[m]);
個人認為一維表簡單一些。
求揹包問題pascal程式
11樓:網友
自己做的。
公式:for i:=1 to m do
for j:=v downto 0 do
if (j>=v1[i]) and (bao[j]其中,v表示總體積,m表示物體個數,v1表示物體體積,w1表示物體價值(重要度)
bao[0...x]從零開始。最後輸出bao[v]。
VB一段程式
呵呵你的輸入是個字串。而不是一個數值。這樣第一個式子算出實際是 25 2 而不是 7 2,你用 cint 函式先把數值轉換為整數即可 浮點數用 cdbl 而第二個式子由於字串不可能有減法,而實際又是個數字,vb 把它當成數值計算了。注意 可以用來做字串連線,也可以做數值加法,如果你確定做字串連線,應...
C中timer控制元件的一段程式
我是這樣 做出來的。控制元件 textbox,button,timer。timer的interval值設為1000.在專案的debug目錄下放置test.txt檔案,內容為1234567890amxjdhflsjdaflkdfisdfwergghh.執行後一秒一變 using system.io p...
Pascal細胞問題我的程式哪裡不對懂的進
不像樓上說的那樣,其實你只有一點錯了 陣列是從1.m,1.n的 因此p可以等於m,q也可以等於n 所以把 第四行的 p 再試試還不對的話直接問我 我現在的計算機裡沒有執行pascal的軟體,程式我看了演算法上應該沒有問題。但是有一點就是字串的操作。pascal的字串我不知道能不能這麼用,但是c可以,...