Bagaimana untuk menulis algoritma pengaturcaraan dinamik dalam Python?

王林
Lepaskan: 2023-09-19 12:43:43
asal
1648 orang telah melayarinya

Bagaimana untuk menulis algoritma pengaturcaraan dinamik dalam Python?

Bagaimana untuk menulis algoritma pengaturcaraan dinamik dalam Python?

Algoritma pengaturcaraan dinamik ialah kaedah penyelesaian masalah yang biasa digunakan Ia menguraikan masalah kepada sub-masalah dan menyimpan penyelesaian kepada sub-masalah, dengan itu mengelakkan pengiraan berulang dan meningkatkan kecekapan algoritma. Sebagai bahasa pengaturcaraan yang ringkas dan mudah dibaca, Python sangat sesuai untuk menulis algoritma pengaturcaraan dinamik. Artikel ini akan memperkenalkan cara menulis algoritma pengaturcaraan dinamik dalam Python dan memberikan contoh kod khusus.

1. Rangka kerja asas algoritma pengaturcaraan dinamik
Rangka kerja asas algoritma pengaturcaraan dinamik termasuk langkah berikut:

1 Tentukan keadaan: Bahagikan masalah asal kepada beberapa sub-masalah dan tentukan keadaan setiap sub-masalah.

2. Nyatakan persamaan peralihan: Mengikut keadaan sub-masalah, simpulkan hubungan antara penyelesaian sub-masalah dan penyelesaian masalah asal.

3 Tentukan keadaan awal: Tentukan penyelesaian kepada sub-masalah terkecil sebagai keadaan awal.

4 Tentukan susunan pengiraan: Tentukan susunan pengiraan masalah dan pastikan penyelesaian kepada sub-masalah telah dikira sebelum digunakan.

5 Kira hasil akhir: Kira penyelesaian kepada masalah asal melalui persamaan peralihan keadaan.

2. Contoh Kod

Berikut ialah contoh algoritma pengaturcaraan dinamik klasik: masalah ransel. Katakan ada beg galas yang boleh memuatkan barang dengan berat tertentu. Terdapat n item, setiap item mempunyai berat w dan nilai v. Bagaimanakah anda memilih apa yang hendak dimasukkan ke dalam beg galas anda supaya ia mempunyai jumlah nilai yang paling besar?

Berikut ialah kod algoritma pengaturcaraan dinamik untuk melaksanakan masalah knapsack dalam Python:

def knapsack(W, wt, val, n):
    # 创建一个二维数组dp,用于存储子问题的解
    dp = [[0 for _ in range(W + 1)] for _ in range(n + 1)]
    
    # 初始化边界条件
    for i in range(n + 1):
        dp[i][0] = 0
    for j in range(W + 1):
        dp[0][j] = 0
    
    # 通过动态规划计算每个子问题的解
    for i in range(1, n + 1):
        for j in range(1, W + 1):
            if wt[i-1] <= j:
                dp[i][j] = max(dp[i-1][j-wt[i-1]] + val[i-1], dp[i-1][j])
            else:
                dp[i][j] = dp[i-1][j]
    
    # 返回原问题的解
    return dp[n][W]

# 测试
W = 10  # 背包的最大容量
wt = [2, 3, 4, 5]  # 物品的重量
val = [3, 4, 5, 6]  # 物品的价值
n = len(wt)  # 物品的数量

print("背包问题的最大价值为:", knapsack(W, wt, val, n))
Salin selepas log masuk

Dalam kod di atas, knapsack函数用于计算背包问题的最大价值。dp数组用于存储子问题的解,其中dp[i][j]表示前i个物品放入容量为j的背包中的最大价值。通过两层循环遍历所有子问题,并根据状态转移方程更新dp数组中的数值。最后返回dp[n][W] digunakan sebagai penyelesaian kepada masalah asal.

Ringkasan:
Artikel ini memperkenalkan cara menulis algoritma pengaturcaraan dinamik dalam Python dan memberikan contoh masalah ransel. Proses penulisan algoritma pengaturcaraan dinamik termasuk langkah-langkah menentukan keadaan, persamaan peralihan keadaan, menentukan keadaan awal, menentukan urutan pengiraan dan mengira hasil akhir. Pembaca diminta membuat pelarasan dan pengubahsuaian yang sesuai kepada algoritma mengikut keperluan masalah tertentu. Saya percaya bahawa dengan mengkaji artikel ini, pembaca boleh membiasakan diri dengan algoritma pengaturcaraan dinamik dan menguasai cara melaksanakannya dalam Python.

Atas ialah kandungan terperinci Bagaimana untuk menulis algoritma pengaturcaraan dinamik dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan