求解思路:求出各物品價值與體積之比,由高到低排序,盡可能放價值比高的物品。
""""
author:xuke
實現功能:利用貪心演算法求解揹包問題
"""#各物品的體積列表
v =[
]#各物品的價值列表
val =
#各物品編號
num =
#各物品**/體重
v_val =
#輸入揹包體積
vs =
eval
(input
("揹包體積為:"))
#輸入物品種類數
s =eval
(input
("物品種類數目為:"))
#輸入各物品資訊
for i in
range
(s):
input
("第{}類物品的編號為:"
.format
(i+1))
)eval
(input
("第{}類物品的體積為:"
.format
(i +1)
)))eval
(input
("第{}類物品的價值為:"
.format
(i +1)
)))print
("各物品資訊:"
)print
("編號:{}"
.format
(num)
)print
("體積:{}"
.format
(v))
print
("價值:{}"
.format
(val)
)#計算**與體重之比
for i in
range
(s):
/v[i]
)#排序
for i in
range
(s):
for j in
range
(i+1
,s):
if v_val[i]
< v_val[j]
: v_val[i]
,v_val[j]
= v_val[j]
,v_val[i]
v[i]
,v[j]
= v[j]
,v[i]
val[i]
,val[j]
= val[j]
,val[i]
num[i]
,num[j]
= num[j]
,num[i]
print
("編號:{}"
.format
(num)
)print
("體積:{}"
.format
(v))
print
("價值:{}"
.format
(val)
)#不可分割物品
#當前揹包占用體積
v1_now =
0#當前揹包內價值
val1_now =
0print
("揹包內加入的物品編號有:"
,end='')
for i in
range
(s):
if(v[i]
+ v1_now)
<= vs:
v1_now +=v[i]
val1_now += val[i]
print
(num[i]
,end='')
else
:break
print()
#揹包占用體積為
print
("揹包體積:{}"
.format
(v1_now)
)print
("揹包價值:{}"
.format
(val1_now)
)#可分割物品
#當前揹包占用體積
v2_now =
0#當前揹包內價值
val2_now =
0print
("揹包內加入的物品編號有:"
,end='')
for i in
range
(s):
if(v[i]
+ v2_now)
<= vs:
v2_now +=v[i]
val2_now += val[i]
print
(num[i]
,end='')
elif v2_now < vs:
last = vs - v2_now
val2_now +=val[i]
*(last/v[i]
) v2_now = vs
print
(num[i]
,end='')
elif v2_now == vs:
break
print()
print
("揹包價值:{}"
.format
(val2_now)
)
揹包問題(貪心演算法)
揹包問題 程式8 4 2.cpp 定義控制台應用程式的入口點。揹包問題 貪心演算法 include stdafx.h define maxnumber 20 typedef struct node object float find object wp,int n,float m i 0 while...
貪心演算法 揹包問題
詳細見原帖 我寫的是自己的感悟 揹包問題 有乙個揹包,揹包容量是m 150。有7個物品,物品可以分割成任意大小。要求盡可能讓裝入揹包中的物品總價值最大,但不能超過總容量。物品 a b c d e f g 重量 35 30 60 50 40 10 25 價值 10 40 30 50 35 40 30 ...
貪心演算法 揹包問題
貪心演算法 當前最優解 例如在刪除數的乙個例子中,乙個長度不大於240位的整數中,隨機刪除n個數,要求使得剩餘的數 從左到右的,組成乙個最小的整數 貪心步驟 例如 乙個數 1457326 n 4 1 找到當前最大的數 7 刪除 145326 2 找到當前最大的數 6 刪除 14532 3 找到當前最...