公交汽車 揹包再次應用

2022-08-30 11:21:14 字數 3131 閱讀 9673

[題目描述]

乙個特別的單行街道在每公里處有乙個汽車站。顧客根據他們乘坐汽車的公里數來付費。例如下表就是乙個費用的單子。

kilometres  1  2  3  4  5  6  7 8  9  10

price   12 21 31 40 49 58 69 79 90 101

沒有一輛車子行駛超過10公里,乙個顧客打算行駛n公里(1<=n<=100),它可以通過無限次的換車來完成旅程。最後要求費用最少。

[輸入]

第一行十個整數分別表示行走1到10公里的費用(<=500)。注意這些數並無實際的經濟意義,即行駛10公里費用可能比行駛一公里少。

第二行乙個整數n表示,旅客的總路程數。

[輸出]

僅乙個整數表示最少費用。

[輸入]

12 21 31 40 49 58 69 79 90 101

15[輸出]

147題解:

看揹包看多了,看完第一想法就是多重揹包..

f[i]表示花費i費用所行走的最長路程.

v[i]行走w[i]公里花費的價錢

w[i]其實就是i..(...).

i:=0..v 若f[i]>=n了,i 即為最低價錢.

//寫到這總覺得有點兒什麼問題,求解..

//好吧,想到了第二種方法,

code1:

1 function max(a,b:longint):longint; begin if a>b then exit(a) else exit(b); end;

2var

3 f:array[0..50000] of

longint;

4 num,v,w:array[0..11] of

longint;

5i,n:longint;

6vv:longint;

7procedure zeroonepack(cost,weight:longint);

8var

9j:longint;

10begin

11 for j:=vv downto cost do

12 f[j]:=max(f[j],f[j-cost]+weight);

13end;

14procedure completepack(cost,weight:longint);

15var

16j:longint;

17begin

18 for j:=cost to vv do

19 f[j]:=max(f[j],f[j-cost]+weight);

20end;

21procedure multiplepack(cost,weight,amount:longint);

22var

23k:longint;

24begin

25if cost*amount>=vv then

26begin

27completepack(cost,weight);

28exit;

29end;

30 k:=1

;31 while kdo

32begin

33 zeroonepack(cost*k,weight*k);

34dec(amount,k);

35 k:=k shl 1;36

end;

37 zeroonepack(amount*cost,amount*weight);

38end;

39begin

40 for i:=1

to10

do41

begin

42read(v[i]);

43end;

44 for i:=1

to10

do w[i]:=i;

45read(n);

46 for i:=1

to10

do47 vv:=max(v[i]*(n div i +1

),vv);

48 for i:=1

to10

do num[i]:=n div i;

49 for i:=1

to10

do50

multiplepack(v[i],w[i],num[i]);

51 for i:=0

to vv do

52if f[i]>=n then begin writeln(i); halt; end;

53 //555..一開始光看樣例了寫成了f[i]>=15

..居然還對乙個點..

54end.

55(*

)2012/11/07(

*)

code2:

完全揹包..

看上去靠譜了許多..

f[i]為走了這麼多路所需的最小價值...

似乎好簡單..//55...為什麼一開始非要寫複雜的多重揹包.

1 function min(a,b:longint):longint; begin if a2var

3 f:array[0..50000] of

longint;

4 v:array[0..11] of

longint;

5i,n:longint;

6procedure completepack(weight:longint);

7var

8j:longint;

9begin

10 for j:=i to n do

11if f[j]=0 then f[j]:=f[j-i]+weight

12 else f[j]:=min(f[j],f[j-i]+weight);

13end;

14begin

15 for i:=1

to10

doread(v[i]);

16read(n);

17 for i:=1

to10

do18

completepack(v[i]);

19writeln(f[n]);

20 end.

0 1揹包和完全揹包問題應用

name 0 1揹包和完全揹包問題應用 author date 26 07 17 22 45 description 0 1揹包問題應用 數字組合問題 有m個正整數1 m,找出其中和為n的可能的組合方式。如 m 5,則5個數分別為1,2,3,4,5,n 5 那麼可能的組合有5 1 4和5 2 3和5...

0 1 揹包實際應用

from dj 有許多程式設計師都熱愛玩遊戲,而小j自稱為遊戲王,曾玩過幾百種遊戲,幾乎所有能玩到的遊戲大作都玩遍了。隨著時間的推移,他發覺已經沒有遊戲可以讓他玩了!於是他想改玩一些古老的遊戲,以成為真正的 遊戲王 他希望在接下來的一段時間內將過去出的遊戲全部玩一遍,但是畢竟時間有限,因此他感到很苦...

計蒜客 汽車費用(完全揹包)

乙個特別的單行街道在每公里處有乙個汽車站。顧客根據他們乘坐汽車的公里使來付費。例如下表就是乙個費用的單子。沒有一輛車子行駛超過10公里,乙個顧客打算行駛n公里 1 n 100 它可以通過無限次的換車來完成旅程。最後要求費用最少。輸入格式 第一行十個整數分別表示行走1到10公里的費用 500 注意這些...