Pythonは動的計画法01ナップサック問題を実装します

コード:https//blog.csdn.net/qq_34178562/article/details/79959380

理論の説明:

https://www.bilibili.com/video/BV1K4411X766?from=search&seid=13724711054890720316

https://www.bilibili.com/video/BV1XD4y1S7nv?from=search&seid=13724711054890720316

 

最初にデータ入力を想定します。6つのもの、Aのものは2kg相当の2セント、Bのものは2kg相当の3セント、Cのものは3kg相当の1セント、Dのものは1kg相当の5セント、Eのものは5kgの重さ40セントの価値があります。ものFの重さは2kgで30セントに相当します。10kgのランドセルが最大で収容できる数セント相当のものについて尋ねられました。

この問題には、動的計画法テーブルの確立が必要です。このテーブルの作成プロセスを理解できれば、コードの記述方法を知ることができます。

値(グロス) 0kg 1kg 2kg 3kg 4kg 5kg 6kg 7kg 8kg 9kg 10kg
物を置かないでください 0 0 0 0 0 0 0 0 0 0 0
A w = 2 v = 2 0 0 2 2 2 2 2 2 2 2 2
B w = 2 v = 3 0 0 3 3 5 5 5 5 5 5 5
C w = 3 v = 1 0 0 3 3 5 5 5 6 6 6 6
D w = 1 v = 5 0 5 5 8 8 10 10 10 11 11 11
E w = 5 v = 4 0 5 5 8 8 10 10 10 12 12 14
F w = 2 v = 3 0 5 5 8 8 11 11 13 13 13 15

まず第一に、物を入れないと、バックパックは間違いなく無価値なので、残っている物の列は0です。バックパックの容量は0で、物を入れることはできません。また、バックパックには値がないため、0kgの列は0です。

次に、対応する式を見てみましょう。Vij)は、最初のi個のアイテムが容量jでバックパックに入れられることを意味します。

1)行Aを見てみましょう。(A、1kg)は0に等しいのですが、なぜ0に等しいのか、1kgはAの重量よりも小さい2kgであり、j < wiに準拠しているため、(A、1kg)は次のようになります。 (A、0kg)に等しく、これは0に等しい。

2)(A、2kg)が2に等しいことを見てみましょう。なぜ、2に等しいのですか?2kgはA 2kgの重量に等しく、j > = wiと一致しているため、(A、2kg)はmax( (物を入れない、2kg)、(物を入れない、2kg-2kg)+ Aの値)、つまり、max(0、0 + 2)= 2。

3)行Aの後ろを見る。iは変更されていないので、maxの前の項目は常に(物を入れないでください、*)= 0になり、maxの後者の項目は常に(しないでください)になります。 *)+ A。値= 2なので、行Aの後ろにすべて2があります。

ファイン製品

4)(B、1kg)が0に等しい理由、0に等しい理由、1kgがBの重量である2kgよりも小さい、j < wiに準拠しているため、(B、1kg)が等しい理由を見てみましょう。〜(B、0kg)、これは0に等しい。

5)(B、2kg)が3に等しい、なぜ3に等しいのか、2kgはBの重量が2kgに等しい、j > = wiに沿っているので、(B、2kg)はmaxに等しいとしましょう。((A、2kg)、(A、2kg-2kg)+ B値)、つまり、max(2、0 + 3)= 3。

6)(B、4kg)が5に等しいことを見てみましょう。なぜ、5に等しいのですか?j > = wiと一致して、4kgはB 2kgの重量よりも大きいため、(B、4kg)はmax( (A、4kg)、(A、4kg-2kg)+ B値)、つまり、max(2、2 + 3)= 5。

対照的な作品

7)(D、1kg)が5に等しい、なぜ5に等しいのか、1kgはD 1kgの重量に等しい、j > = wiに準拠しているので、(D、1kg)はmax(( C、1kg)、(C、1kg-1kg)+ D値)、つまり、max(0、0 + 5)= 5。

8)(F、10kg)を見てみましょう。10kgはFの重量より2kg大きいため、j > = wiに準拠しているため、(F、10kg)はmax((E、10kg)、(E、 10kg-2kg)+ F値)、つまり、max(14、12 + 3)= 15。

最後に、質問への答えは、10kgのバックパックが最大1元と5セントを保持できるということです。

 

コードのコピーを保存し、式を念頭に置いて、コード内のを区別ます

def bag(n, c, w, v):
    """
    测试数据:
    n = 6  物品的数量,
    c = 10 书包能承受的重量,
    w = [2, 2, 3, 1, 5, 2] 每个物品的重量,
    v = [2, 3, 1, 5, 4, 3] 每个物品的价值
    """
    #置零,表示初始状态
    value = [[0 for j in range(c + 1)] for i in range(n + 1)]
    for i in range(1, n + 1):
        for j in range(1, c + 1):

            #
            value[i][j] = value[i - 1][j]

            #
            if j >= w[i - 1] and value[i][j] < value[i - 1][j - w[i - 1]] + v[i - 1]:
                value[i][j] = value[i - 1][j - w[i - 1]] + v[i - 1]

    #打印动态规划表
    for x in value:
        print(x)

    return value

#w = list(map(int,input().split(' ')))
#v = list(map(int,input().split(' ')))
#c = eval(input())

w = [2, 2, 3, 1, 5, 2]
v = [2, 3, 1, 5, 4, 3]
c = 10
n = len(v)
print('{}'.format(bag(n,c,w,v)[n][c]))

 

おすすめ

転載: blog.csdn.net/XLcaoyi/article/details/115034607