[題目描述]
乙個特別的單行街道在每公里處有乙個汽車站。顧客根據他們乘坐汽車的公里數來付費。例如下表就是乙個費用的單子。
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 a2var3 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 注意這些...